1
我有一个Java客户端,它使用Apache HttpClient 4.1库向不需要身份验证的服务器发出HTTP请求。如果我用浏览器或卷曲调用该服务器,则会接受请求。但是从我的Java客户端,我看到下面的(当调试打开时)...Java客户端无法与服务器建立SSL握手
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
main, handling exception: java.net.SocketException: Connection reset
因此,似乎我的客户的确在使用TLSv1握手但随后派出的SSLv2客户问候似乎该服务器没有喜欢。根据this post似乎服务器不应拒绝SSLv2 ClientHello。它可能是一些特定的关于这个服务器,使它拒绝这ClientHello?
我还注意到,在建立连接的开始,下面的日志输出....
keyStore is :
keyStore type is : jks
keyStore provider is :
init keystore
init keymanager of type SunX509
trustStore is: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert:
Subject: CN=Secure Global CA, O=SecureTrust Corporation, C=US
然后它继续补充各种实体作为“可信证书” S。
,最终例外,我注意到的是...
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
所以可以将它与证书(或缺乏)在我(客户端)端的问题?但根据this post我认为客户不需要提供证书。
底线是我不清楚,如果问题的根源是SSLv2客户端你好或证书或两者兼而有之?
这和安全性有什么关系?我建议将其移至编程。 – 2016-01-21 16:05:15
我在辩论放哪里,但我选择这里,因为问题的关键是为什么服务器会拒绝SSLv2客户端你好(这里的帖子表明它不应该),并且客户端需要自己的证书(这里的帖子也表示它不)。 – AbuMariam
通常,客户端不需要证书。我会首先排除SSL/TLS协议不匹配。访问https://www.ssllabs.com/ssltest/并输入服务器的主机名,这个工具会告诉你服务器支持哪些SSL/TLS协议。然后,从Java客户端向https://www.ssllabs.com/ssltest/viewMyClient.html发出GET请求,并且这会告诉您客户端支持哪些SSL/TLS协议。 – mti2935