TooTallNate / Java-WebSocket

A barebones WebSocket client and server implementation written in 100% Java.
http://tootallnate.github.io/Java-WebSocket
MIT License
10.36k stars 2.57k forks source link

ssl == null when set bks to webSocketServer in Android #1327

Closed Zain-yh closed 1 week ago

Zain-yh commented 1 year ago

Describe the bug I use websokcetServer in android, but when i set bks, client cant connect to server by ssl

onError: java.lang.NullPointerException: ssl == null

The code is as follows : `private void startServer() { port = Integer.parseInt(et_port.getText().toString()); server = new WebSocketServer(new InetSocketAddress(port)) { @Override public void onOpen(WebSocket conn, ClientHandshake handshake) { Log.e(TAG, "onOpen: " + handshake.getResourceDescriptor()); }

        @Override
        public void onClose(WebSocket conn, int code, String reason, boolean remote) {
            Log.e(TAG, "onClose: " + reason);
        }

        @Override
        public void onMessage(WebSocket conn, String message) {
            Log.e(TAG, "onMessage: ");
        }

        @Override
        public void onError(WebSocket conn, Exception ex) {
            Log.e(TAG, "onError: " + ex.toString());

        }

        @Override
        public void onStart() {
            Log.e(TAG, "onStart: ");
        }
    };

    server.setWebSocketFactory(new DefaultSSLWebSocketServerFactory(getSSL()));

    server.start();
}

private SSLContext getSSL() {
    try {
        String pass = "abcdefg";
        KeyStore ks = KeyStore.getInstance("BKS");
        InputStream keystoreStream = getResources().openRawResource(R.raw.websocket_bycert);
        ks.load(keystoreStream, pass.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
        kmf.init(ks, pass.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
        tmf.init(ks);
        SSLContext ssl = SSLContext.getInstance("TLS");
        ssl.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        return ssl;
    } catch (KeyStoreException | UnrecoverableKeyException | CertificateException | IOException | NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }
    return null;
}`
marci4 commented 1 week ago

https://github.com/TooTallNate/Java-WebSocket/wiki/Getting-a-SSLContext-from-different-sources#getting-a-sslcontext-using-a-keystore-on-android worked always for me.