java - SOAP 故障 : No trusted certs found

标签 java security ssl certificate

简介

我正在为会计系统开发一项功能,该系统获取包含销售数据的 XML 文件,将其发送到政府服务器,然后接收响应消息。您还需要一些证书来确保发件人的真实性。我正在使用其他人的客户端来完成加密、调用 web 服务、处理证书、接收回消息等所有艰苦的工作。我只需编写一个简单的应用程序来调用该客户端的函数并将文件、证书和一些参数发送给它。

错误

我的应用程序在 Playground 服务器上测试时似乎运行良好。然而,当我使用生产消息尝试生产服务器时(即使生产服务器上的生产消息直到 2016 年 12 月 1 日才被视为实际合法销售,他们才刚刚开始),应用程序抛出错误,这非常奇怪,因为以后开发类似应用程序的任何开发人员在发布应用程序之前都没有机会发现此错误。

问题

问题是,错误指向客户端的加密/安全库中的某处。我从来没有处理过这类事情,所以我完全不知道从哪里开始寻找。最重要的是,这个错误似乎相当罕见,而且我发现的一些注释在很大程度上与我的项目无关,或者至少在我对这个领域不了解的情况下,它们看起来是这样的。

下面是堆栈跟踪。如果任何更精通这些库的人能指出我可能出问题的地方,我将不胜感激。请询问您是否需要更多信息/测试。

    WARNING: Interceptor for {http://fs.mfcr.cz/eet/schema/v3}EETService#{http://fs.mfcr.cz/eet/schema/v3}OdeslaniTrzby has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: Error during certificate path validation: No trusted certs found
        at org.apache.cxf.ws.security.wss4j.WSS4JUtils.createSoapFault(WSS4JUtils.java:277)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:333)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:190)
        at cz.tomasdvorak.eet.client.security.SecureEETCommunication$1.handleMessage(SecureEETCommunication.java:135)
        at cz.tomasdvorak.eet.client.security.SecureEETCommunication$1.handleMessage(SecureEETCommunication.java:119)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:802)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1673)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1551)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1348)
        at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56)
        at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:215)
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:651)
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:516)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:425)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:138)
        at com.sun.proxy.$Proxy70.odeslaniTrzby(Unknown Source)
        at cz.tomasdvorak.eet.client.EETClientImpl.submitReceipt(EETClientImpl.java:39)
        at cz.tomasdvorak.eetdemo.Main.main(Main.java:134)
Caused by: org.apache.wss4j.common.ext.WSSecurityException: Error during certificate path validation: No trusted certs found
        at org.apache.wss4j.common.crypto.Merlin.verifyTrust(Merlin.java:877)
        at cz.tomasdvorak.eet.client.security.MerlinWithCRLDistributionPointsExtension.verifyTrust(MerlinWithCRLDistributionPointsExtension.java:34)
        at org.apache.wss4j.dom.validate.SignatureTrustValidator.verifyTrustInCerts(SignatureTrustValidator.java:108)
        at org.apache.wss4j.dom.validate.SignatureTrustValidator.validate(SignatureTrustValidator.java:64)
        at org.apache.wss4j.dom.processor.SignatureProcessor.handleToken(SignatureProcessor.java:185)
        at org.apache.wss4j.dom.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:428)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:278)
        ... 23 more

最佳答案

服务器证书不受信任,这意味着签署证书的证书颁发机构不包含在 java trustore 中。要解决这个问题,您必须获取 CA 证书并导入您的应用程序托管库或 jvm 托管库。或者,如果证书是自签名的,您应该将此服务器证书作为可信证书导入到 trustore 中。

关于java - SOAP 故障 : No trusted certs found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611220/

相关文章:

java - 如何从高度图扰动表面法线

java - 配置上下文特定的 Tomcat 安全领域

Java DLL 安全一般问题

ssl - 无法在 cert-manager 中获取 TLS 证书

java - JPA - "no Metadata found for type"异常

java - java中的逻辑右移运算符

java - Android 应用风格可在输出 APK 中包含某些文件

internet-explorer - 为什么实现 IObjectSafety 没有什么不同?

ssl - 在有或没有 BIO 的情况下使用 OpenSSL TLS?

python - 扭曲的 SSL 套接字连接速度变慢