socket.io-android-chat icon indicating copy to clipboard operation
socket.io-android-chat copied to clipboard

How to connect to a socket server on SSL/HTTPS?

Open raiehtisham opened this issue 9 years ago • 10 comments

I am unable to find any reference to making connection to https server. I have tested my server with a web based client and its working.

raiehtisham avatar Sep 01 '15 14:09 raiehtisham

Please read README https://github.com/socketio/socket.io-client-java

nkzawa avatar Sep 01 '15 17:09 nkzawa

@nkzawa myHostnameVerifier, myX509TrustManager, and mySSLContext aren't accounted for. Would you post a working example?

ProductOfAmerica avatar Jan 14 '18 07:01 ProductOfAmerica

Hi All, Following code worked for me. You can try.

        IO.Options opts = new IO.Options();
        SSLContext mySSLContext = SSLContext.getInstance("TLS");
        TrustManager[] trustAllCerts= new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }

            public void checkClientTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }
        } };

        mySSLContext.init(null, trustAllCerts, null);

        HostnameVerifier myHostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        opts = new IO.Options();
        opts.sslContext = mySSLContext;
        opts.hostnameVerifier = myHostnameVerifier;
        mSocket = IO.socket(https://<yourURL>,opts);

Hope this will help. Have a nice day!

chathurangamdk avatar Jan 16 '18 03:01 chathurangamdk

@chathurangamdk any idea how to implement this now? Both fields are now gone:

opts.sslContext = mySSLContext;
opts.hostnameVerifier = myHostnameVerifier;

ProductOfAmerica avatar Aug 26 '18 16:08 ProductOfAmerica

@ProductOfAmerica here what you want

{
    try {
        String socketUrl = YOUR_HTTPS_URL;
        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {

            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {

            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[0];
            }
        }};
        X509TrustManager trustManager = (X509TrustManager) trustAllCerts[0];

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, null);
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .hostnameVerifier(hostnameVerifier)
                .sslSocketFactory(sslSocketFactory, trustManager)
                .build();

        IO.Options opts = new IO.Options();
        opts.callFactory = okHttpClient;
        opts.webSocketFactory = okHttpClient;
        mSocket = IO.socket(socketUrl, opts);
    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }
}

ghost avatar Sep 10 '18 12:09 ghost

@msalshaikh thank you so much, finally a working example

ProductOfAmerica avatar Sep 12 '18 21:09 ProductOfAmerica

Thank you very much! Spent two days before finding your solution.

ghost avatar Feb 20 '19 08:02 ghost

Library info: implementation('io.socket:socket.io-client:0.8.3') { exclude group: 'org.json', module: 'json' }

opts.callFactory = okHttpClient; opts.webSocketFactory = okHttpClient;

unable to resolve callFactory and webSocketFactory, Please help.

nicemak avatar May 23 '19 06:05 nicemak

Still unable to connect to websocket using this code, or one that actually DOES verify hostname and validate certificate..

Whether through polling then upgrading to websocket, or directly using websocket only, my app still doesn't connect to websocket..

Please help..

    static {
        try {
            HostnameVerifier verifier = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    HostnameVerifier hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
                    Log.v("SPLASH_HOSTNAME", "" + hostnameVerifier.verify("mgas006-mgas-ws.webware.om", session));
                    return hostnameVerifier.verify("mgas006-mgas-ws.webware.om", session);
                }
            };

            TrustManager[] trustAll = new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                            try {
                                chain[0].checkValidity();
                            } catch (Exception e) {
                                throw new CertificateException("Certificate not valid or trusted.");
                            }
                        }

                        @Override
                        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                            try {
                                chain[0].checkValidity();
                                Log.v("SPLASH_SOCKET", "trusted");
                            } catch (Exception e) {
                                Log.v("SPLASH_SOCKET", "untrusted");
                                throw new CertificateException("Certificate not valid or trusted.");
                            }
                        }

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[0];
                        }
                    }
            };

            X509TrustManager trustManager = (X509TrustManager)trustAll[0];

            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, trustAll, null);

            OkHttpClient client = new OkHttpClient.Builder()
                    .hostnameVerifier(verifier)
                    .sslSocketFactory(context.getSocketFactory(), trustManager)
                    .build();

            IO.Options options = new IO.Options();
            options.callFactory = client;
            options.webSocketFactory = client;
            options.transports = new String[] {WebSocket.NAME};

            Log.v("SPLASH_NAME", WebSocket.NAME);

            socket = IO.socket(MGasApi.HOST, options);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
    }

ZainabAl-khabori avatar Jul 18 '19 05:07 ZainabAl-khabori

finally working. use this library in app build.gradle : implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } instead implementation 'com.github.nkzawa:socket.io-client:0.6.0'

then use code from

@ghost

@ProductOfAmerica here what you want

{
    try {
        String socketUrl = YOUR_HTTPS_URL;
        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {

            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {

            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[0];
            }
        }};
        X509TrustManager trustManager = (X509TrustManager) trustAllCerts[0];

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, null);
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .hostnameVerifier(hostnameVerifier)
                .sslSocketFactory(sslSocketFactory, trustManager)
                .build();

        IO.Options opts = new IO.Options();
        opts.callFactory = okHttpClient;
        opts.webSocketFactory = okHttpClient;
        mSocket = IO.socket(socketUrl, opts);
    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }
}

derrylieyanto avatar May 20 '20 20:05 derrylieyanto