gpt4 book ai didi

java - SSL 连接重置

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:43 24 4
gpt4 key购买 nike

我正在尝试连接到 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 浏览器连接到此服务器,也可以使用 curl 伪造的 SOAP 请求;这是特定于 Java 的东西。

因此,很明显,Java 和 HTTPS 服务器之间在握手应该如何进行的问题上存在一些分歧,这可能意味着服务器有一些奇怪的 SSL 配置。但是,我无法直接访问服务器,而访问服务器的人位于地球的另一端,因此由于时区差异很大,通信有点紧张。

如果我的假设是正确的,那么可能存在哪些 SSL 问题?什么可能导致这样的事情?我在哪里可以要求服务器控制人员查找问题?当我使用 curl 发出请求时,我得到了这些服务器配置 header :

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 是我所知道的唯一解决方案。

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

  • 如果您手动创建套接字,您可以设置启用的协议(protocol)

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

    java -Dhttps.protocols=SSLv3

关于java - SSL 连接重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37677062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com