java – SSL连接重置

前端之家收集整理的这篇文章主要介绍了java – SSL连接重置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过 Java连接到HTTPS端点.我尝试过的每个方法(下面的更多细节)最终生成这个堆栈跟踪:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:753)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)

我努力了:

>连接javax SOAP库和一个新的URL(“https:// …”)
>连接新的URL(“https:// …”).openConnection()
手动创建SSL连接:

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();

    SSLSocket socket = (SSLSocket) factory.createSocket("...",443);

    Writer out = new OutputStreamWriter(socket.getOutputStream());
    // https requires the full URL in the GET line
    //
    out.write("GET / HTTP/1.0\r\n");
    out.write("\r\n");
    out.flush();

    // read response
    BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
    int c;
    while ((c = in.read()) != -1) {
        System.out.write(c);
    }

    out.close();
    in.close();
    socket.close();

更多细节:

>我尝试过的每种方法都对其他SSL服务器起作用,这是特定的服务器(我无法讨论什么服务器,它是业务伙伴)
>我可以使用Web浏览器连接到这个服务器,并且使用带有卷曲的SOAP请求伪造;这是Java特定的东西.

所以,很明显,Java和HTTPS服务器之间的握手应该如何下降,这可能意味着服务器有一些奇怪的SSL配置,有一些不一致.然而,我没有直接访问服务器,而在世界各地的人都是这样,所以沟通有点紧张,因为时区不同.

如果我的假设是正确的,可能会有什么可能的SSL问题?什么可能导致这样的事情?我可以在哪里请求控制服务器的人寻找问题?当我使用curl执行请求时,我会收回这些服务器配置头:

Server: Apache/2.2.9 (Debian) mod_jk/1.2.26 PHP/5.2.6-1+lenny10 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By: PHP/5.2.6-1+lenny10
X-SOAP-Server: NuSOAP/0.7.3 (1.114)

解决方法

这是一个SSL版本的问题.服务器仅支持SSLv3,Java将从v2开始,并尝试向上协商,但并不是所有的服务器都支持这种协商.

强制java只使用SSLv3是我知道的唯一解决方案.

编辑,有两种方法来做到这一点,我知道:

>如果手动创建套接字,可以设置已启用的协议

socket.setEnabledProtocols(new String [] {“SSLv3”});
>如果您使用的是更高级别的库,则可能需要将所有SSL请求设置为仅使用v3,这是通过“https.protocols”系统属性完成的:

java -Dhttps.protocols = SSLv3

猜你在找的Java相关文章