Java SSLHandshakeException“没有共同的密码套件”我正在使用SSLServerSocket接受我的openSUSE服务器上的客户端连接,但它们都不能连接。我总是得到一个SSLHandshakeException说no cipher suites in common。我已经激活了所有可能的套件,启用了多个协议,尝试使用最新的oracle JRE和openjdk。我还在论坛和东西上关注了其他几个帖子并“解锁”了oracle jre中的所有密码套件,我改变了openjdk jre的设置,如下所示:已禁用:已#security.provider.10=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg 启用:security.provider.9=sun.security.ec.SunEC这是我初始化SSLServerSocket的方式: System.setProperty("javax.net.ssl.keyStore", "./keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "nopassword");
java.lang.System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("TLSv1.2");
sc.init(null, trustAllCerts, new SecureRandom());
SSLServerSocket ssl = (SSLServerSocket) sc.getServerSocketFactory().createServerSocket(
DownloadFilelist.PORT);
// Got rid of:
//ssl.setEnabledCipherSuites(sc.getServerSocketFactory().getSupportedCipherSuites());
ssl.setEnabledProtocols(new String[] {"TLSv1", "TLSv1.1", "TLSv1.2", "SSLv3"});
// System.out.println(Arrays.toString(ssl.getEnabledCipherSuites()));
s = ssl;
// s = new ServerSocket(DownloadFilelist.PORT);
s.setSoTimeout(TIMEOUT);问题是我无法找出客户想要的密码套件,也不能影响它。我启动了程序-Djavax.net.debug=ssl,handshake,这是结果。你们有人能弄明白问题是什么吗?
3 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
我自己有这个例外,我钻研了JRE源代码。很明显,这个信息很容易引起误解。它可能意味着它所说的,但更普遍意味着服务器没有以所请求的方式响应客户端所需的数据。例如,如果密钥库中缺少证书,或者尚未使用适当的算法生成证书,则可能发生这种情况。实际上,考虑到默认安装的密码套件,由于缺少通用的密码套件,人们不得不花一些时间来真正得到这个例外。在我的特定情况下,我使用默认的DSA算法生成证书,当我需要让服务器与Firefox一起工作时,我就是RSA。
慕无忌1623718
TA贡献1744条经验 获得超4个赞
这个问题可能是由于对客户端或服务器上启用的密码套件的过度操作造成的,但我怀疑最常见的原因是服务器根本没有私钥和证书。
注意:
ssl.setEnabledCipherSuites(sc.getServerSocketFactory().getSupportedCipherSuites());
摆脱这条线。你的服务器已经不安全了TrustManager
。然后-Djavax.net.debug=SSL,handshake,
尝试一个连接运行您的服务器,并在此处发布结果输出。
添加回答
举报
0/150
提交
取消