我收到此错误:javax.net.ssl.SSLHandshakeException: no cipher suites in common
尝试在Java服务器和android客户端之间进行SSL套接字通信时。
我使用以下行来创建密钥文件:keytool -genkey -keystore mySrvKeystore -keyalg RSA
服务器代码:
System.setProperty("javax.net.ssl.keyStore","mySrvKeystore.key");
System.setProperty("javax.net.ssl.keyStorePassword","1234567");
private SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
private SSLServerSocket sslserversocket;
private SSLSocket sslsocket;
sslserversocket= (SSLServerSocket) sslserversocketfactory.createServerSocket(port);
sslsocket = (SSLSocket) sslserversocket.accept();
客户代码:
System.setProperty("javax.net.ssl.trustStore","mySrvKeystore.key");
System.setProperty("javax.net.ssl.trustStorePassword","1234567");
sslsocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, SERVERPORT);
private SSLSocketFactory sslsocketfactory = (SSLSocketFactory)
SSLSocketFactory.getDefault();
private SSLSocket sslsocket;
任何想法如何解决这个问题?
服务器的证书是自签名的,连接是否有可能失败?
谢谢。
最佳答案
您必须在SSLServerSocket或SSLSocket中更改已启用的密码套件。不要那样做如果必须,请确保设置两个对等方都支持的子集。
编辑在您的客户代码中,您有
System.setProperty("javax.net.ssl.trustStore","mySrvKeystore.key");
即您将服务器密钥库用作客户端信任库。不要那样做密钥库包含私钥,它不应位于服务器之外的任何位置。您需要从该密钥库中导出服务器证书,并将其作为受信任的CA证书导入到客户端信任库中。