我正在尝试为我也编写的基于CXF的Web服务实现客户端。
我的Web服务运行良好(通过soapUI测试正常),但是运行客户端失败,并显示以下内容:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323)
该消息明确指出了证书问题,因此我进行了快速搜索,找到了在CXF中支持SSL的正确方法,并将以下内容添加到了Spring应用程序上下文配置XML:
<http:conduit name="https://myserver/myws/register/soap?wsdl:{http://glob.reg.com/myws}.http-conduit">
<http:tlsClientParameters>
<sec:keyManagers keyPassword="password">
<sec:keyStore type="JKS" password="password"
file="my/file/dir/Morpit.jks"/>
</sec:keyManagers>
<sec:trustManagers>
<sec:keyStore type="JKS" password="password"
file="my/file/dir/Truststore.jks"/>
</sec:trustManagers>
<sec:cipherSuitesFilter>
<!-- these filters ensure that a ciphersuite with
export-suitable or null encryption is used,
but exclude anonymous Diffie-Hellman key change as
this is vulnerable to man-in-the-middle attacks -->
<sec:include>.*_EXPORT_.*</sec:include>
<sec:include>.*_EXPORT1024_.*</sec:include>
<sec:include>.*_WITH_DES_.*</sec:include>
<sec:include>.*_WITH_AES_.*</sec:include>
<sec:include>.*_WITH_NULL_.*</sec:include>
<sec:exclude>.*_DH_anon_.*</sec:exclude>
</sec:cipherSuitesFilter>
</http:tlsClientParameters>
<http:authorization>
<sec:UserName>Betty</sec:UserName>
<sec:Password>password</sec:Password>
</http:authorization>
<http:client AutoRedirect="true" Connection="Keep-Alive"/>
</http:conduit>
并重建了客户。客户端构建成功,但是我仍然得到相同的确切错误和相同的堆栈跟踪,好像我从未添加过该http:conduit
东西一样。
我尚未将证书添加到存储中,并且存储路径不正确,但这是有意的,因为我只是想查看重新构建的客户端如何报告此问题并调整为新http:conduit
信息。
相反,我很惊讶地发现它被完全忽略了。
我错过了什么?
解决这个问题的正确方法是什么?
更新: 我刚刚注意到我的applicationcontext.xml http:conduit
带有以下错误消息:
The prefix "http" for element "http:conduit" is not bound.
因此,我进行了快速搜索,发现了一个提示:
客户端需要使用包含STS证书的密钥库配置HTTP管道,例如:
<http:conduit name="https://localhost:.*">
<http:tlsClientParameters disableCNCheck="true">
<sec:trustManagers>
<sec:keyStore type="jks" password="cspass" resource="clientstore.jks"/>
</sec:trustManagers>
</http:tlsClientParameters>
</http:conduit>
这加强了@GreyBeardedGeek的内容。现在要为此工作
…
问题解决了!
我仔细阅读了这篇magicmonster文章(请注意“
java的较旧版本”的亮点以及默认密码“
changeit”),以将整个自签名证书链导入到Java的受信任证书列表中:
http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html
还有一个非常重要的 附加功能 : 对链中的所有证书(不仅是根证书)都这样做! (在我的情况下,有三个:组织的,中间的和根的)
然后…转到 Spring应用程序上下文配置XML 并修改该<http:conduit
部分,使其具有Java的 cacerts
文件的正确路径(和密码):
<http:tlsClientParameters>
<sec:keyManagers keyPassword="changeit">
<sec:keyStore type="JKS" password="changeit"
file="C:\Program Files (x86)\Java\jdk1.6.0_45\jre\lib\security\cacerts"/>
</sec:keyManagers>
<sec:trustManagers>
<sec:keyStore type="JKS" password="changeit"
file="C:\Program Files (x86)\Java\jdk1.6.0_45\jre\lib\security\cacerts"/>
</sec:trustManagers>
我正在使用restTemplate发出post请求,并收到以下错误:无法找到到请求目标的有效证书路径 我的方法如下:
问题内容: 我有一个可以从https服务器下载文件的类。当我运行它时,它返回很多错误。我的证书似乎有问题。是否可以忽略客户端服务器认证?如果是这样,怎么办? 错误: 问题答案: 当你的服务器具有自签名证书时,会出现此问题。要解决此问题,你可以将此证书添加到JVM的受信任证书列表中。 在本文中,作者描述了如何从浏览器中获取证书并将其添加到JVM的cacerts文件中。你可以使用-参数编辑文件或运行应
我在Flutter中创建了一个新应用程序。我尝试在Android Mobile上运行该应用程序。它显示在错误下方。 但当我试图在Chrome或Edge(网络设备)上运行同样的程序时。它在跑。
我最近为我的maven repo(Apache代理背后的人工制品)切换到了letsencrypt证书。通过浏览器访问回购协议工作正常,证书没有问题(下面的屏幕截图)。 如果我手动将证书导入到java密钥库中,它也可以工作。 但是根据这个SO问题,Java应该接受以8u101开头的lets加密证书。 我总是遇到这样的例外:
我在Apache Tomcat7上有一个web应用程序,我的web应用程序上有不可信的证书。我的web应用程序必须与另一个使用HTTPS的web应用程序通信。然而,我总是遇到这样一个例外: 连接失败:javax.net.ssl.sslhandShakeException:sun.security.validator.validatoreXception:PKIX路径构建失败:sun.securit
我试图访问我的应用程序中的网址,但我得到了这个错误。 我尝试应用所有这些修复,但没有成功:http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/ 很快,它需要运行InstallCert应用程序(j