2011-02-07 7 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

どうやらトリックは "DirectReference" にWSS4JOutInterceptorのsignatureKeyIdentifierプロパティを設定することです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値が何をするかである要求、中に埋め込まれるクライアント公開証明書を期待しています。もう1つの選択肢は、サーバーがすべてのクライアント公開証明書を保管し、サーバーが正しい公開証明書を識別し、署名を検証するためのID(最初のケース)を要求することです。

関連する問題