2012-03-03 66 views
6

按照说明here并重新创建了我以前未正确创建的证书。由于我现在在服务器上看到了javax.net.ssl.SSLHandshakeException: no cipher suites in common,在客户端上看到了javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure,所以有所改变。相反,错误this questionSSLHandshakeException:不共享密码套件

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

上得到两端很好地起到任何提示的,请注意,我使用本地主机,所以我会假设加密功能是相同的。


更新:

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

在服务器(由this引导下) :

$ keytool -genkey -alias serverkey -keyalg RSA -keypass [email protected] -storepass [email protected] -keystore keystore.jks

$ keytool -export -alias serverkey -storepass [email protected] -file server.cer -keystore keystore.jks

$ keytool -import -v -trustcacerts -alias clientkey -file ../client/client.cer -keystore cacerts.jks -keypass [email protected] -storepass [email protected]

在客户端(通过this指南):

$ 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

回答

4
javax.net.ssl.SSLHandshakeException: no cipher suites in common 

这有两个原因:

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

  2. 客户端或服务器或两者强加的对密码套件的过度限制使得不能达成协议。

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

服务器:

$ keytool -import -v -trustcacerts -alias clientkey -file ../client/client.cer -keystore cacerts.jks -keypass [email protected] -storepass [email protected] 

客户:

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

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

+0

我除去多余条目,我仍然收到相同的错误。我试着按照这里的注释将相应的证书导入到密钥库中:http://stackoverflow.com/questions/9547980/unable-to-find-valid-certification-path-to-requested-target-and-certificate-unkn# comment12099962_9547980。我可能仍然在混淆信任和密钥存储。另外,请注意这些是自签名证书。 – Astron 2012-03-04 02:17:37

+1

@Astron(1)是否更改了代码行'ks.load(new FileInputStream(“testkeys”),passphrase)'以加载相应的密钥库而不是'testkeys',以及(2)您是否可以运行客户端 - Djavax.net.debug = ssl,握手并将结果编辑到您的帖子中。 – EJP 2012-03-04 03:38:54

+1

需要为客户端/服务器指定trustStore,因为它们使用默认的trustStore,从而导致失败。在客户端上使用-Djavax.net.ssl.trustStore =/home/share/samples/sockets/client/cacerts.jks -Djavax.net.ssl.trustStorePassword = changeit以及类似的服务器相应代码允许会话完成。奇怪的是,该应用程序支持客户端身份验证,但在客户端/服务器代码中没有trustStore条款。感谢您的调试信息,这非常有帮助!添加调试建议给你回答。 – Astron 2012-03-04 05:12:42

2

在Cassandra集群上设置SSL时出现此错误。

keytool -genkey -alias -keystore .keystore

它省略了RSA的说明书中作为算法,应为(see v1.2 docs):原来的问题描述生成密钥时要的version 2.0文档中

keytool -genkey -alias -keyalg RSA -keystore .keystore