我试图建立与安全服务器的连接,并且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>

10-05 18:49