How can I set SignalR in Android Studio to ignore SSL issues for delvelopement
android, android-studio, signalr, ssl, ssl-certificate
Solution
If just for development, I think you can refer the following code (available in SO):
public class HttpsTrustManager implements X509TrustManager {
private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
@Override
public void checkClientTrusted(
X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {}
@Override
public void checkServerTrusted(
X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {}
public boolean isClientTrusted(X509Certificate[] chain) {
return true;
}
public boolean isServerTrusted(X509Certificate[] chain) {
return true;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return _AcceptedIssuers;
}
public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
SSLContext context = null;
if (trustManagers == null) {
trustManagers = new TrustManager[] {
new HttpsTrustManager()
};
}
try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(context != null ? context.getSocketFactory() : null);
}
}
Then in your Activity, call `HttpsTrustManager.allowAllSSL();` before SignalR methods call.
Problem
I have a site which uses SignalR. The code below (taken from SignalR-Chat example) connects to the production site with its verified SSL. It uses the jars from SignalR/java-client. But for development I need to connect to a the VS project which is hosted on my computer with IIS Express and a local SSL which my Nexus can't and not supposed to verify, and I get the following errors: ``` 08-17 16:13:55.540 2153-6860//System.out﹕ HubConnection: Error executing request: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 08-17 16:13:55.541 2153-6859//System.err﹕ java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. ``` I already opened the relevant ports in the firewall and I can reach the IIS Express with Rest requests. Here's the code: ``` public class gtSockets { public static final String URL = myUrl + "/signalr/hubs/"; HubConnection connection; HubProxy hub; DemonThread thread; private Context context; private static gtSockets gtSockets; private gtSockets(Context context) { this.context = context; initConnection(); } public static gtSockets newInstance(Context context) { if(gtSockets == null) { gtSockets = new gtSockets(context); } return gtSockets; } private void initConnection() { Platform.loadPlatformComponent(new AndroidPlatformComponent()); connection = new HubConnection(URL, null, true, new Logger() { @Override public void log(String s, LogLevel logLevel) { } }); hub = connection.createHubProxy("myHub"); hub.on("broadcastMessage", new SubscriptionHandler2<String, String>() { @Override public void run(String msgType, String msg) { } }, String.class,String.class); thread = new DemonThread(); thread.start(); } public void destroy() { if(thread != null) { thread.cancel(); thread = null; } if(connection != null) { connection.stop(); } } private class MessageSendTask extends AsyncTask<String,String,String> { @Override protected String doInBackground(String... params) { hub.invoke("send","directory",params[1]); return "ok"; } } private class DemonThread extends Thread { boolean isRunning = true; @Override public void run() { SignalRFuture<Void> awaitConnection = connection.start(); while(isRunning) { try { awaitConnection.get(); } catch (InterruptedException | ExecutionException e){ e.printStackTrace(); } } awaitConnection.cancel(); } public void cancel() { if(isRunning) { isRunning = false; } } } } ``` The questions is how can I set SignalR to ignore SSL issues for development?! Thanks.