0

I need to implement a secure Websocket Server in Android. I have used https://github.com/TooTallNate/Java-WebSocket . This is working fine for insecure connection. But once I make the webserversocket as secure, I get SSL Handshake exception. Does anyone know about this issue? Are there are other websocket libraries for Android that support secure connections.

Here is the code

private void startSecureWss() throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {

    InputStream caInput = null;
    try {
        caInput = new BufferedInputStream(getAssets().open("newCert.cert"));
    } catch (IOException e) {
        e.printStackTrace();
    }


    CertificateFactory certificateFactory = null;
    certificateFactory = CertificateFactory.getInstance("X.509");

    X509Certificate cert = null;
    cert = (X509Certificate) certificateFactory.generateCertificate(caInput);

    String alias = cert.getSubjectX500Principal().getName();


    KeyStore trustStore = null;
    trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

    trustStore.load(null);

    trustStore.setCertificateEntry(alias, cert);

    KeyManagerFactory kmf = null;
    kmf = KeyManagerFactory.getInstance("X509");
    String password = "abcd123";

    kmf.init(trustStore, password.toCharArray());

    KeyManager[] keyManagers = kmf.getKeyManagers();


    TrustManagerFactory tmf = null;
    tmf = TrustManagerFactory.getInstance("X509");

    tmf.init(trustStore);
    TrustManager[] trustManagers = tmf.getTrustManagers();


    SSLContext sslContext = null;
    sslContext = SSLContext.getInstance("TLS");

    sslContext.init(keyManagers, trustManagers, null);

    mServer = new MySocketServer(new InetSocketAddress("127.0.0.1", 6663));
    mServer.setWebSocketFactory(new DefaultSSLWebSocketServerFactory(sslContext));

    mServer.start();
}

MySocketServer class

public class MySocketServer extends WebSocketServer {

private static String TAG=MySocketServer.class.getSimpleName();
private WebSocket mSocket;
private Activity mActivity;

public MySocketServer(InetSocketAddress address) {
    super(address);
    Log.i(TAG, "constructor");
}

public MySocketServer(int port) {
    super( new InetSocketAddress( port ) );
    Log.i(TAG, "constructor");
}

public void setActivity(Activity activity) {
    this.mActivity=activity;
}

@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
    mSocket = conn;
    Log.i(TAG, "onOpen");
}

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

@Override
public void onMessage(WebSocket conn, String message) {
    Log.i(TAG, "onMessage "+message);
    //((MainActivity)mActivity).setMessage(message);
    EventBus.getDefault().post(new MessageEvent(message));
    EventBus.getDefault().post(new SomeOtherEvent());
}

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

public void sendMessage(String message) {
    Log.i(TAG, "sendMessage "+message);
    mSocket.send(message);
}

}

user1527969
  • 66
  • 1
  • 6

0 Answers0