首页 文章

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

提问于
浏览
1

我有一个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 . 根据this post,似乎服务器不应该拒绝SSLv2 ClientHello . 可能是这个服务器特定的东西让它拒绝这个ClientHello?

我也注意到在 Build 连接之初的下面的日志输出....

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

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

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

相关问题