Fixed socket factory not working on android 4.0.3. Can be reimplemented when fixing #4

master
Keith Irwin 2017-04-26 22:30:11 -04:00
parent 68ac5a17b0
commit e34ebd2f0a
No known key found for this signature in database
GPG Key ID: 378933C743E2BBC0
2 changed files with 90 additions and 90 deletions

View File

@ -26,12 +26,12 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.security.KeyStore;
import java.util.Arrays;
//import java.security.KeyStore;
//import java.util.Arrays;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
//import javax.net.ssl.TrustManager;
//import javax.net.ssl.TrustManagerFactory;
//import javax.net.ssl.X509TrustManager;
import okhttp3.Call;
import okhttp3.FormBody;
@ -176,18 +176,18 @@ public class LoginActivity extends AppCompatActivity implements
private void authenticateWithTracmanServer(final Request request) throws Exception {
// Needed to support TLS 1.1 and 1.2
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:"
+ Arrays.toString(trustManagers));
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
// TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
// TrustManagerFactory.getDefaultAlgorithm());
// trustManagerFactory.init((KeyStore) null);
// TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
// if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
// throw new IllegalStateException("Unexpected default trust managers:"
// + Arrays.toString(trustManagers));
// }
// X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(new TLSSocketFactory(), trustManager)
// .sslSocketFactory(new TLSSocketFactory(), trustManager)
.build();
client.newCall(request).enqueue(new Callback() {

View File

@ -1,75 +1,75 @@
package us.keithirwin.tracman;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
/**
* @author fkrauthan
* From: https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
*/
public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory internalSSLSocketFactory;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
internalSSLSocketFactory = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return internalSSLSocketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return internalSSLSocketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
}
return socket;
}
}
//package us.keithirwin.tracman;
//
//import java.io.IOException;
//import java.net.InetAddress;
//import java.net.Socket;
//import java.net.UnknownHostException;
//import java.security.KeyManagementException;
//import java.security.NoSuchAlgorithmException;
//
//import javax.net.ssl.SSLContext;
//import javax.net.ssl.SSLSocket;
//import javax.net.ssl.SSLSocketFactory;
//
///**
// * @author fkrauthan
// * From: https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
// */
//public class TLSSocketFactory extends SSLSocketFactory {
//
// private SSLSocketFactory internalSSLSocketFactory;
//
// public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
// SSLContext context = SSLContext.getInstance("TLS");
// context.init(null, null, null);
// internalSSLSocketFactory = context.getSocketFactory();
// }
//
// @Override
// public String[] getDefaultCipherSuites() {
// return internalSSLSocketFactory.getDefaultCipherSuites();
// }
//
// @Override
// public String[] getSupportedCipherSuites() {
// return internalSSLSocketFactory.getSupportedCipherSuites();
// }
//
// @Override
// public Socket createSocket() throws IOException {
// return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
// }
//
// @Override
// public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
// return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
// }
//
// @Override
// public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
// return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
// }
//
// @Override
// public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
// return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
// }
//
// @Override
// public Socket createSocket(InetAddress host, int port) throws IOException {
// return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
// }
//
// @Override
// public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
// return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
// }
//
// private Socket enableTLSOnSocket(Socket socket) {
// if(socket != null && (socket instanceof SSLSocket)) {
// ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
// }
// return socket;
// }
//
//}