我试图建立与安全服务器的连接,并且Java代码由于SSLHandshakeException而失败。当我启用-Djavax.net.debug = all时,出现以下错误:
main,RECV TLSv1.2警报:致命,握手失败
%%无效:[会话1,SSL_RSA_WITH_3DES_EDE_CBC_SHA]
主要,称为closeSocket()
主要,处理异常:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
我已经进行了足够的搜索并尝试过:-Dhttps.protocols和-Dhttps.cipherSuites选项,但它们似乎都不起作用。
我还检查了:
socketfactory.getDefaultCipherSuites()
其中列出了错误中指出的密码。
我检查了
openssl s_client-连接网址:443
但是它抛出一个错误:
验证错误:num = 20:无法获取本地颁发者证书
验证返回:0
58555:错误:14094410:SSL例程:SSL3_READ_BYTES:sslv3警报握手失败:/SourceCache/OpenSSL098/OpenSSL098-52.30.1/src/ssl/s3_pkt.c:1145:SSL警报编号40
58555:错误:140790E5:SSL例程:SSL23_WRITE:ssl握手失败:/SourceCache/OpenSSL098/OpenSSL098-52.30.1/src/ssl/s23_lib.c:185:
赞赏这一方面的快速帮助和指导。
我使用spring ws来执行此操作,在其中我创建了自己的HttpClient,因为此连接需要用于连接的服务器密钥库。以下是我正在使用的代码:
public NewHttpClient(KeyStore keyStore, String pwd, Integer maxTotal, Integer defaultMaxPerRoute) throws KeyManagementException, UnrecoverableKeyException,
NoSuchAlgorithmException, KeyStoreException {
HttpClientBuilder builder = HttpClientBuilder.create();
SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, pwd.toCharArray()).build();
builder.setSSLContext(sslContext);
SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(sslContext);
builder.setSSLSocketFactory(sslConnectionFactory);
Registry<ConnectionSocketFactory> schemeRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory()).build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(schemeRegistry);
connectionManager.setMaxTotal(maxTotal);
connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
builder.setConnectionManager(connectionManager);
customHttpClient = builder.build();
}
更新1:当我从SOAP-UI使用密钥库时,它可以正常工作而没有任何问题。这只是java方法中的一个问题!
更新2:我尝试使用3个JVM 6、7和8,但是问题仍然存在。另外,我尝试通过普通的Java代码而不是spring创建SSL连接,并且能够成功进行握手而没有任何问题。
最佳答案
我看到这是基于更新2的春季问题。因此,我更改了使用
org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender
&瞧,它的工作没有任何问题。
我必须从一个新的Maven jar中导入上述类:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-support</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>