【发布时间】:2026-01-04 06:55:01
【问题描述】:
我在 SAAJ 中编写了一个 Java 客户端,它在通过 HTTP 发送 SOAP 消息时可以成功运行,但是当我尝试通过 HTTPS 将任何 SOAP 消息发送到需要客户端证书的 Web 服务时,它不起作用。
在以下链接的页面底部 - SAAJ Security - 声明如下:
在 SAAJ 方面,您需要做的就是使用带有 HTTPS 作为协议的 URL。这只有在证书成功导入到 /jre/lib/security/cacerts 时才有效;否则 JSSE 将不允许连接
我按照上面的指示将客户端证书和相关的根证书导入我的 Java cacerts 并运行程序,但是我收到以下错误:
java.net.SocketException: Connection reset
我对流量进行了 Wireshark 跟踪,发现当服务器要求 Java 代码提供客户端证书时,我没有提供客户端证书,因此我有以下问题:
1) 通过仅将 HTTPS URL 传递给 soapConnection.call() 方法以及将证书导入我的 cacerts 文件,这是否足以进行身份验证,即 SAAJ 会自动处理吗?或者是否需要更多上述链接中未描述的步骤?
2) 通过将证书导入到我的 JAVA_HOME 中的 cacerts 文件中,Java SAAJ 客户端在调用soapConnection.call() 时是否自动知道要查看此处?还是我需要明确告诉我的代码使用什么 cacerts 文件?
3) 如果 Java SAAJ 客户端自动使用我的 JAVA_HOME 下的 cacerts 文件,那么它如何知道要使用哪个客户端证书?再说一次,我不应该显式地编写代码还是 SAAJ 会自动处理这个?
提前致谢
【问题讨论】: