我有一个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还是证书或者两者兼而有之?
答案 0 :(得分:0)
我有类似你的问题。这就是我解决它的方式。它可能无法满足您的确切问题,但请尝试一下。
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();