2011-02-07 17 views
0

調用期望使用WS-Security對消息進行簽名的Web服務時,存在一個特殊問題。如果我叫用我的客戶端應用程序(使用Apache CXF),我得到一個HTTP 500錯誤消息:當調用需要簽名的Web服務時,「*證書未找到*(來自客戶端)」

*找不到證書*(來自客戶端)

而如果我打電話使用了SoapUI相同的服務,配置爲使用相同的密鑰和密鑰存儲進行簽名,它按預期工作。

我注意到CXF和SoapUI之間的<KeyInfo>部分調用不同。有了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> 

回答

0

顯然,關鍵是要配置WSS4JOutInterceptor的signatureKeyIdentifier屬性爲 「DirectReference」 這創建一個類似於SoapUI的KeyInfo,即它是ac由服務器啓動。

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

服務器期待客戶端公證書被嵌入在請求中,這是什麼DirectReference的signatureKeyIdentifier值一樣。另一種選擇是服務器存儲所有客戶端公共證書,並請求服務器標識符以識別正確的公共證書並驗證簽名(您的第一個案例)。

相關問題