我需要在Android中实现安全的Websocket服务器。我使用过https://github.com/TooTallNate/Java-WebSocket。这对于不安全的连接工作正常。但是,一旦我将webserversocket设置为安全,我就会获得SSL握手异常。有谁知道这个问题? 是否还有其他支持安全连接的websocket库。
这是代码
private void startSecureWss()抛出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类
public class MySocketServer扩展了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);
}
}