有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java与WebSphere的SSL握手错误

将Java HTTP客户端代码与WebSphere server URL连接时遇到错误。测试会抛出SSL握手错误消息:

代码部署使用Java7和Java8进行了测试:

java -Djavax.net.ssl.keyStore=mykey.jks  -Djdk.tls.client.protocols=TLSv1.2 -Djavax.net.debug=ssl,handshake postHTTPWAS

日志文件:

.. 
jdk.tls.client.protocols is defined as TLSv1.2
SSLv3 protocol was requested but was not enabled
.. Extension server_name, server_name: [type=host_name (0), value=myhost.domain.com]
***
main, WRITE: TLSv1 Handshake, length = 155
main, received EOFException: error
main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
main, SEND TLSv1.2 ALERT:  fatal, description = handshake_failure
main, WRITE: TLSv1.2 Alert, length = 2
main, called closeSocket()
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

爪哇。JRE的安全设置配置如下:

...
jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3
jdk.certpath.disabledAlgorithms=SSLv3
com.ibm.jsse2.disableSSLv3=true

问题:

1)为什么SSL跟踪显示对SSLv3的引用,SSLv3是一种在客户端安全设置中被逻辑禁用的协议

2)SSLHandshakeException的根本错误是什么

3)是否可以启用TLSv1。2作为所有HTTPS客户端连接的默认选择,哪个是正确的系统属性


共 (1) 个答案

  1. # 1 楼答案

    我已经发现了错误

    WAS应用服务器的较新版本(完整版)预计客户端将与TLSv1连接。2.对于手动Java JRE调用,请使用参数-Dhttps。协议=TLSv1。2,如下所示:

    /opt/java8/ibm-java-x86_64-80/bin/javac SSLTest.java && /opt/java8/ibm-java-x86_64-80/jre/bin/java -Dhttps.protocols=TLSv1.2  SSLTest
    

    对于ApacheHTTPS客户端(>;V.4.5.2),我添加了几个额外的部分,以使HTTPS与TLSv1连接。2.两个连接现在都正常工作

    // for TLSv1.2 add: 
    import org.apache.http.config.Registry; 
    import org.apache.http.config.RegistryBuilder; 
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import javax.net.ssl.SSLContext;
    import java.security.NoSuchAlgorithmException;
    import java.security.KeyManagementException; 
    import org.apache.http.ssl.SSLContexts;  
    
        //Set the https use TLSv1.2
        private static Registry<ConnectionSocketFactory> getRegistry() throws KeyManagementException, NoSuchAlgorithmException {
            SSLContext sslContext = SSLContexts.custom().build();
            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
                    new String[]{"TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
            return RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", sslConnectionSocketFactory)
                .build();
        }
    
       // for TLSv1.2 use:  
       PoolingHttpClientConnectionManager clientConnectionManager = new PoolingHttpClientConnectionManager(getRegistry());
       clientConnectionManager.setMaxTotal(100);
       clientConnectionManager.setDefaultMaxPerRoute(20);
       HttpClient client = HttpClients.custom().setConnectionManager(clientConnectionManager).build();