我有一个使用 WebLogic 12c 托管服务器托管的 java 应用程序。它正在调用一个安全的外部 API 端点。 这是从 weblogic 服务器到目标服务器的出站连接,例如 https://www.demosite.com/api/end/point。最初,当我收到 SSLHandshake 错误时。
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
我将目标服务器“https://www.demosite.com”的证书导入到 weblogic 托管服务器中的 CustomTrust.jks 密钥库中。还将相同的证书导入到 JAVA 默认密钥库 cacerts 中。
这样我就开始看到成功的 api 调用。但这并不一致。经常看到间歇性故障。所以我决定将以下 java 参数添加到我的托管服务器启动设置中。
-Djdk.tls.client.protocols=TLSv1.2 -Dhttps.protocols=TLSv1.2
托管服务器重新启动是通过删除 Managed_Server tmp 和缓存文件夹来完成的。 此操作项目无助于解决问题。然后对 weblogic 托管服务器设置中的 SSL 配置进行了一些更改。就像下面的,
主机名验证:自定义主机名验证器 自定义主机名验证程序:weblogic.security.utils.SSLWLSWildcardHostnameVerifier 使用服务器证书:选中 两种客户端证书行为:请求客户端证书但未强制执行
我尝试的所有设置都无法彻底解决问题。
从我本地计算机中的 Jdeveloper 集成 weblogic 服务器中,API 调用永远不会失败。仅在运行于 Linux Server 上的 weblogic 托管服务器中才会出现此问题。在我的本地计算机中,我没有明确导入目标服务器证书。我在这里缺少什么?目标仅允许 TLSv1.2/SSLv3 连接。
这个问题已经解决了。发现我应该只在 JKS 密钥库或 java 默认 cacerts 中安装根证书和中间证书,但我的密钥库中缺少中间证书。它不需要目标服务器证书。