繁体   English   中英

调用需要签名的Web服务时,“(从客户端)找不到**证书”

[英]“*Certificate not found* (from client)” when calling Web Service that requires signing

调用期望使用WS-Security对消息进行签名的Web服务时,我遇到了一个特殊的问题。 如果我使用客户端应用程序(使用Apache CXF)进行调用,则会收到HTTP 500错误消息:

*找不到证书*(来自客户端)

而如果我使用配置为使用相同密钥和密钥存储进行签名的SoapUI调用相同的服务,它将按预期工作。

我注意到,调用的<KeyInfo>部分在CXF和SoapUI之间有所不同。 使用CXF(如下所示)时,KeyInfo在<X509Data>部分等中有很多详细说明,而SoapUI调用仅包含一个简单的<SecurityTokenReference> 我怀疑这种差异可能是服务器无法识别用于签名的证书的原因。

不幸的是,我无法控制服务器端,因此无法在服务器端进行大量调查。 很高兴知道这是否是一个已知问题以及是否有任何解决方法?

问候,奥拉

CXF:

<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="KeyId-1007572087">
<wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-1355509614"><ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509IssuerSerial xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:X509IssuerName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">C=SE,O=Company,CN=Company Test Corporate CA 01,SERIALNUMBER=516406-0120</ds:X509IssuerName>
    <ds:X509SerialNumber xmlns:ds="http://www.w3.org/2000/09/xmldsig#">29382</ds:X509SerialNumber>
</ds:X509IssuerSerial></ds:X509Data></wsse:SecurityTokenReference></ds:KeyInfo>

SoapUI:

<ds:KeyInfo Id="KeyId-850CCDA383426C4A1E129683271974138"><wsse:SecurityTokenReference wsu:Id="STRId-850CCDA383426C4A1E129683271974139" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><wsse:Reference URI="#CertId-850CCDA383426C4A1E129683271974137" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1"/></wsse:SecurityTokenReference></ds:KeyInfo>

显然,诀窍是将WSS4JOutInterceptor的signatureKeyIdentifier属性配置为“ DirectReference”,该属性创建类似于SoapUI的KeyInfo,即服务器已接受它。

            <spring:bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
            <spring:constructor-arg>
                <spring:map>
                    <spring:entry key="signatureKeyIdentifier" value="DirectReference"/>
                </spring:map>

服务器期望客户端公共证书被嵌入到请求中,这就是DirectReference的signatureKeyIdentifier值所做的。 另一个选项是服务器存储所有客户端公共证书,并请求为服务器提供标识符以标识正确的公共证书并验证签名(第一种情况)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM