2016-01-21 111 views
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客户端你好或证书或两者兼而有之?

+0

这和安全性有什么关系?我建议将其移至编程。 – 2016-01-21 16:05:15

+0

我在辩论放哪里,但我选择这里,因为问题的关键是为什么服务器会拒绝SSLv2客户端你好(这里的帖子表明它不应该),并且客户端需要自己的证书(这里的帖子也表示它不)。 – AbuMariam

+0

通常,客户端不需要证书。我会首先排除SSL/TLS协议不匹配。访问https://www.ssllabs.com/ssltest/并输入服务器的主机名,这个工具会告诉你服务器支持哪些SSL/TLS协议。然后,从Java客户端向https://www.ssllabs.com/ssltest/viewMyClient.html发出GET请求,并且这会告诉您客户端支持哪些SSL/TLS协议。 – mti2935

回答

0

我有类似你的问题。这是我解决它的方式。它可能不会迎合您的具体问题,但请试一试。

SSLContextBuilder builder = new SSLContextBuilder(); 
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); 
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); 
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 
相关问题