0

问题描述

通过 Https URL 发送 SOAP 请求时出现“javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接”错误

环境:

1) Weblogic 10.3.6.0.1
2) java 版本 "1.6.0_31" Java(TM) SE Runtime Environnent (build 1.6.0_31-b04)
3) Https Server 发布请求的地方是 Jetty Server

概述:

1)在应用程序的先前版本中,它通过 https URL 向服务器 1 发送 SOAP 消息
2)在当前版本中,我们实现了新要求,其中我们使用内部调用第三方 https 服务器
的第三方客户端 jar 3)第三方客户端 jar 正在设置建立 SSL 证书并发布请求。对于 SSL,他们使用 443 端口,我们为他们的主机服务器打开了代理。
4) 现在我们有 2 个第三方服务器,我们通过 Https 连接。服务器 1 https 端口为 30042,服务器 2 https 端口为 443。

错误的用例场景:

1)通过https向服务器1提交请求,正确获取响应。
2)通过代理服务器使用第三方客户端jar向Server2提交请求,正确获取响应。
3) 通过 https 向服务器 1 提交请求,失败并出现错误“javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake”。
4)使用第三方客户端jar向Server2提交请求,正确获取响应。
5)在服务器 1 上它总是会失败,我们无法通过 Https 发送 SOAP 消息
6)对于服务器 1 应用程序正在使用 SOAPConnection 和 URL API 通过 Https URL 发布SOAP 消息
7)对于服务器 2 应用程序正在使用第三方提供的 jar它在内部打开插座并在上面写字

错误代码

-------------------------------------------------- -
javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接

此环境的最新变化

目前,我们将应用程序从 Solaris 迁移到 Suse Luunix 服务器。

处理器规格

Linux onsrnasdfgpsdev1 2.6.32.54-0.3-default #1 SMP 2012-01-27 17:38:56 +0100 x86_64 x86_64 x86_64 GNU/Linux
Weblogic 10.3.6.01 java 版本“1.6.0_31”Java(TM) SE 运行时环境(构建1.6.0_31-b04) Java HotSpot(TM) 64 位服务器 VM(内部版本 20.6-b01,混合模式)

解决方法

• 对于服务器1 连接,如果我们创建一个原始套接字并设置主机和端口(30042)。
• 请求进展顺利。
• 但是,如果我们使用 SOAPConnection 或 HttpsURLConnection,则请求不会进行并引发握手错误
• 如果我们对 Server1 使用 Http Url,一切正常

4

1 回答 1

0

如果在这种情况下使用系统属性设置了代理,那么所有后续的 Https 调用都将使用该代理,即使您没有在程序中进行设置,java 也会在内部执行此操作。

在我们的例子中,我们想要在没有代理的情况下访问服务器 1,而对于服务器 2,我们想要代理。因此,当我们第一次尝试访问 Server2 时,我们使用系统属性设置代理,之后当我们尝试连接到服务器 1 时,它失败了,因为 https 请求正在通过代理,并且在我们的代理服务器上没有设置策略服务器 1

解决方案:1)不要在系统级别设置代理,在连接级别添加 2)在代理服务器中为服务器 1 添加规则,因此服务器 1 和 2 都通过代理 3)在运行时从系统属性中删除代理,然后调用 server1 之后重新设置。这样服务器 2 通过代理。

解决方案将取决于条件;选择适合您的。

谢谢巴努塔帕
_

于 2013-08-01T15:33:21.010 回答