具有特定协议版本的SSL连接

时间:2014-01-23 12:37:47

标签: java ssl

我正在尝试使用以下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 个答案:

答案 0 :(得分:4)

Oracle Java不支持SSLv2。对于某些需要它的古老网站,它仅支持SSLv2Hello消息以及更高级别的协议。因此你得到的错误信息。 SSLv2Hello是一种伪协议,它只是告诉Java以SSLv2Hello消息而不是SSLv3或TLS Hello消息开始。

我相信IBM的JRE支持SSLv2。

然而,几乎可以肯定的是,您尝试连接的服务器也支持SSLv3,TLS等(如果不支持,则应该升级,或者作为不安全方式脱机)。因此,只需保留启用的密码套件,您就可以连接Oracle JRE。

答案 1 :(得分:1)

要获得答案,最好参考http://tools.ietf.org/html/rfc6176

简而言之,SSL V2在服务器端中断,但是可以接受初始SSL V2客户端请求,但协商永远不会在V2上解决。