SoapFault:找不到受信任的证书

SoapFault: No trusted certs found

简介

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

错误

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

问题

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

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

    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.handleMessage(SecureEETCommunication.java:135)
        at cz.tomasdvorak.eet.client.security.SecureEETCommunication.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 信任库中。要解决这个问题,您必须获取 CA 证书并导入您的应用程序托管库或 jvm 托管库。或者,如果证书是自签名的,您应该将此服务器证书作为可信证书导入到 trustore 中。