使用特定协议版本建立SSL连接

4

我正在尝试使用以下JAVA代码执行特定协议版本的SSL连接:

    System.out.println("Locating socket factory for SSL...");
    SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
    System.out.println("Creating secure socket to " + https_url + ":443");
    SSLSocket sslSocket = (SSLSocket)sslsocketfactory.createSocket();
    String []protocol = {"SSLv2Hello"};
    sslSocket.setEnabledProtocols(protocol);
    SocketAddress addr = new InetSocketAddress(https_url,443);
    sslSocket.connect(addr);
    String [] P = sslSocket.getEnabledProtocols();
    System.out.println("Enabled Protocol: " + Arrays.toString(P));

在运行代码时,我遇到了以下异常: Exception in thread "main" java.lang.IllegalArgumentException: SSLv2Hello cannot be enabled unless at least one other supported version is also enabled. at sun.security.ssl.ProtocolList.(Unknown Source) at sun.security.ssl.ProtocolList.(Unknown Source) at sun.security.ssl.SSLSocketImpl.setEnabledProtocols(Unknown Source) at CheckByURL.test(CheckByURL.java:36) at CheckByURL.main(CheckByURL.java:15) 当我尝试使用其他SSL版本时,它可以正常工作。
有人知道如何解决这个问题吗?
2个回答

4
Oracle Java不支持SSLv2。它仅支持与更高级别的协议一起使用的SSLv2Hello消息,用于某些需要它的古老网站。因此您收到了错误消息。 SSLv2Hello是一种伪协议,它只是告诉Java从SSLv2Hello消息开始,而不是SSLv3或TLS Hello消息。
我相信IBM的JRE支持SSLv2。
但是几乎可以肯定,您要连接的服务器也支持SSLv3、TLS等(如果不支持,应该进行升级或下线以确保安全)。所以只需保留启用的密码套件,您就可以使用Oracle JRE连接。

1

关于此问题的答案,最好参考https://www.rfc-editor.org/rfc/rfc6176

简而言之,SSL V2已在服务器端停用,但初始的SSL V2客户端请求可能会被接受,但协商不应使用V2。


我正在尝试连接的服务器使用SSL v2。当我使用SSL实验室进行SSL测试时,似乎该服务器支持SSL v2。 - user3202597

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接