SSLHandshakeException:没有共同的密码套件

Ast*_*ron 6 java authentication ssl ssl-certificate

按照此处的说明重新创建我以前错误创建的证书.我现在javax.net.ssl.SSLHandshakeException: no cipher suites in common在服务器和javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure客户端看到的东西已经改变了.而不是错误这个问题

服务器是ClassFileServer.java和相应的客户端SSLSocketClientWithClientAuth.java

关于让两端发挥得很好的任何提示,请注意我使用的是localhost所以我认为密码功能是相同的.


更新:

以下是我用来生成文件的步骤,我可能会混淆密钥和信任库:

在服务器上(指南后面):

$ keytool -genkey -alias serverkey -keyalg RSA -keypass p@ssw0rd -storepass p@ssw0rd -keystore keystore.jks

$ keytool -export -alias serverkey -storepass p@ssw0rd -file server.cer -keystore keystore.jks

$ keytool -import -v -trustcacerts -alias clientkey -file ../client/client.cer -keystore cacerts.jks -keypass p@ssw0rd -storepass p@ssw0rd

在客户端(通过指南):

$ keytool -genkey -alias clientkey -keyalg RSA -keypass changeit -storepass changeit -keystore keystore.jks

$ keytool -export -alias clientkey -storepass changeit -file client.cer -keystore keystore.jks

$ keytool -import -v -trustcacerts -alias serverkey -file ../server/server.cer -keystore cacerts.jks -keypass changeit -storepass changeit

由于调试超出了本网站的主体限制,不得不使用其他媒体:

客户端调试错误: http ://pastebin.com/mHCmEqAk

服务器调试错误: http ://pastebin.com/YZbh7H8f

use*_*421 7

javax.net.ssl.SSLHandshakeException: no cipher suites in common
Run Code Online (Sandbox Code Playgroud)

这有两个原因:

  1. 服务器没有私钥和证书,也可能根本没有密钥库。在这种情况下,它只能使用默认情况下禁用的不安全匿名密码套件,并且应该保持这种状态。所以没有它可以同意与客户端一起使用的密码套件。

  2. 客户端或服务器或两者对密码套件施加过多限制,以致无法达成一致。

重新您的密钥库和信任库,除了您执行四个导入步骤,而您只需要两个导入步骤之外,一切看起来都不错。您不需要将服务器的证书导入到服务器自己的信任库中,或者将客户端的证书导入到客户端的信任库中。你只需要这个:

服务器:

$ keytool -import -v -trustcacerts -alias clientkey -file ../client/client.cer -keystore cacerts.jks -keypass p@ssw0rd -storepass p@ssw0rd
Run Code Online (Sandbox Code Playgroud)

客户:

$ keytool -import -v -trustcacerts -alias serverkey -file ../server/server.cer -keystore cacerts.jks -keypass changeit -storepass changeit
Run Code Online (Sandbox Code Playgroud)

并且您只需要它,因为您使用的是自签名证书。简单的解决方案:不要。使用 CA 签名的证书,Java 附带的默认信任库信任该证书。

  • 需要为客户端/服务器指定 trustStore,因为它们使用默认的 trustStore,导致失败。在客户端使用 -Djavax.net.ssl.trustStore=/home/share/samples/sockets/client/cacerts.jks -Djavax.net.ssl.trustStorePassword=changeit 在客户端和类似的服务器代码允许会话完成。奇怪的是,该应用程序支持客户端身份验证,但在客户端/服务器代码中没有 trustStore 条款。感谢您提供调试信息,这非常有帮助!将调试建议添加到您的答案中。 (2认同)