Java客户端无法与服务器建立SSL握手

时间:2016-01-21 15:21:27

标签: ssl certificate java

我有一个Java客户端,它使用Apache HttpClient 4.1库向不需要身份验证的服务器发出HTTP请求。如果我用浏览器或curl调用该服务器,则接受该请求。但是,从我的Java客户端,我看到以下内容(打开调试时)...

 main, WRITE: TLSv1 Handshake, length = 81
 main, WRITE: SSLv2 client hello message, length = 110
 main, handling exception: java.net.SocketException: Connection reset

所以看来我的客户端在TLSv1中进行了握手,但后来发送了服务器似乎不喜欢的SSLv2 ClientHello。根据{{​​3}},服务器似乎不应拒绝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

然后它继续将各种实体添加为“受信任的证书”。

我注意到的最后一个例外是......

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

那么我(客户)方面的证书(或缺少)是否会出现问题?但根据this post,我认为客户不需要提供证书。

底线是我不清楚问题的根源是SSLv2客户端Hello还是证书或者两者兼而有之?

1 个答案:

答案 0 :(得分:0)

我有类似你的问题。这就是我解决它的方式。它可能无法满足您的确切问题,但请尝试一下。

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