当前位置: 首页 > 面试题库 >

SSL连接重置

袁英豪
2023-03-14
问题内容

我正在尝试连接到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进行请求时,我会获得以下服务器配置标头:

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"system属性来完成:

    java -Dhttps.protocols=SSLv3
    


 类似资料:
  • 我第一次使用带有IISExpress的新Visual Studio 2013(以前 ASP.net VS2010上的开发服务器使用)。我在尝试调试项目时遇到问题。 这是我在Chrome看到的: 无法与服务器建立安全连接。这可能是服务器的问题,也可能需要您没有的客户端身份验证证书。错误代码:ERR_SSL_PROTOCOL_ERROR 我更新了我的计划—— 与localhost的连接中断。错误代码:

  • 问题内容: 我正在尝试测试安全的网络套接字,但是遇到了麻烦。这是我的测试: 创建后,这是“ ws”的日志: 我没有从打开回来的日志。我正在本地运行该项目,并且当我使用Chrome Advanced Rest Client工具时,可以正常连接。 我想念什么吗?请帮忙。 编辑: 我添加并注销, 我也尝试遵循此代码,但得到相同的错误。 问题答案: 该模块正在拒绝您的自签名证书(正如人们希望的那样)。您可

  • 问题内容: 如何创建SSL套接字连接? 我真的需要创建密钥库吗?该密钥库应该与我所有的客户端应用程序共享吗? 我用以下代码创建了一个服务器: 我用以下代码在android上创建了一个客户端: 但是当我尝试连接时,会引发以下错误: 问题答案: 您需要一个证书来建立ssl连接,您可以在密钥库中加载证书,也可以加载证书本身。我将显示一些有关keystore选项的示例。 您的代码需要一些参数才能运行: 您

  • 我正在尝试使用javapns库发送ios推送通知。代码在java 6上运行良好,但在java 7上不起作用。我正试图用java代码在ssl套接字上编写这段代码。插座getOutputStream()。写入(字节);但有以下例外:- 2015-09-24 02:01:17330[列表模式下的JavaPNS分组通知线程]错误JavaPNS。通知。PushNotificationManager(Push

  • Ruby版本是2.5。1和gem版本是2.7。7今天更新了这两个版本。OpenSSL是1.0。2今天也更新了。当我跑的时候 我得到以下错误: 我检查了所有GitHub问题,但没有一个有解决方案。我在keychain和openSSL文件夹中添加了证书,但似乎没有任何效果。有什么想法吗? 我还检查了我的路由器和电脑防火墙

  • 问题内容: 我已经在一个网络上的一台服务器上成功设置了启用SSL的MySQL安装,并且可以使用SSL和Linux命令行mysql客户端在不同网络上的另一台服务器上使用SSL连接到它,但是每次我尝试连接时(使用PHP 5.3) .3)我不断得到: 警告:mysqli_real_connect():(HY000 / 2026):第18行上的/var/www/html/test.php中的SSL连接错误