2012-02-07 8 views
1

私はこの問題をかなり苦労しており、どこでも見てもまだ解決できませんでした。Apache CXFからのWCF Webサービスへのアクセス(MTOM + WS-Security)

シナリオの詳細(コード、設定及び他のものは、端部に掲載されている):

  1. WCF Webサービス(.NET 4)、2つのエンドポイント露出:メッセージセキュリティとユーザ名認証を使用して保護されていない一方と固定いずれかを(メンバシップインフラストラクチャを使用) - トランスポートセキュリティはありません。
  2. 両方のエンドポイントはMTOMエンコーディングを使用します。 WSDLによって参照されるすべてのクラスは、MessageContract属性とMessageBodyMember属性を持つメンバーでマークされます。
  3. WCFバインディングの設定では、 'establishSecurityContext'と 'negotiateServiceCredential'がfalseに設定されています。
  4. 暗号化の目的で自己署名入りの証明書で保護されたWCFサービス。
  5. Apache CXF 2.5.1を使用してJavaクライアントからのアクセスを試みています。クラスパスからアクセス可能なKeyStoreに証明書をセットアップしました。

結果:

  1. .NETクライアントからWebサービスへのアクセスは、Apache CXFから保護されていないエンドポイントへのアクセス
  2. 正常に動作してとMTOMエンコーディングなしの両方正常に動作します。
  3. Apache CXFから保護されたエンドポイント(MTOMなし)にアクセスすると正常に動作します。 CXFトレースは、暗号化/復号プロセスが正常に実行されることを示します。
  4. MTOMがWCFで起動されると、問題が発生しました。私たちは、WCF側では、メッセージの受信、その処理、応答の生成/暗号化が正常に行われることを確認できました。
  5. 問題が発生したことをCXFで受信中です。メッセージの復号化を試みる前に、CXFがMTOM添付ファイルを適切に逆シリアル化していないことがわかります。したがって、解読ロジックは、メッセージが依然として応答で解読する要素を有するが、解読するための空の要素を見つけて失敗することを発見した。添付ファイルを初期化するためにRECEIVEフェーズインターセプタを追加しようとしましたが、マルチパートレスポンスで境界マーカを見つけようとして失敗しました。 (明確にするために短縮)

    のWeb.Config:

    <system.serviceModel> 
        <!-- Services --> 
        <services> 
         <service name="TestServices.Services.TestService" behaviorConfiguration="TestService.Basic"> 
         <!-- Plain (unsecured) endpoint --> 
         <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TestService.Basic" name="TestService.Basic" 
            contract="TestServices.Interfaces.ITestService" bindingNamespace="http://searchtechnologies.com/cpa/wcfinterop"/> 
         <!-- Secure endpoint --> 
         <endpoint address="/secure" binding="wsHttpBinding" bindingConfiguration="TestService.Secure" name="TestService.Secure" 
            contract="TestServices.Interfaces.ITestService" bindingNamespace="http://searchtechnologies.com/cpa/wcfinterop"/> 
         </service> 
        </services> 
        <!-- Bindings --> 
        <bindings> 
         <wsHttpBinding> 
         <binding name="TestService.Basic" messageEncoding="Mtom"> 
          <security mode="None"> 
          <message clientCredentialType="None"/> 
          <transport clientCredentialType="None"/> 
          </security> 
         </binding> 
         <binding name="TestService.Secure" messageEncoding="Mtom"> 
          <security mode="Message"> 
          <message clientCredentialType="UserName" establishSecurityContext="false" negotiateServiceCredential="false"/> 
          <transport clientCredentialType="None"/> 
          </security> 
         </binding> 
         </wsHttpBinding> 
        </bindings> 
        <!-- Behaviors --> 
        <behaviors> 
         <serviceBehaviors> 
         <behavior name="TestService.Basic"> 
          <serviceMetadata httpGetEnabled="true"/> 
          <serviceDebug includeExceptionDetailInFaults="true"/> 
          <serviceCredentials> 
          <serviceCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="equiros-PC2.search.local"/> 
          <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlProvider"/> 
          </serviceCredentials> 
         </behavior> 
         </serviceBehaviors> 
        </behaviors> 
    
    アタッチメントが

CODE/CONFIG/STUFFを呼ぶとフィドラーを使用

  • は、我々は、応答がうまく形成見えることがわかっ

    Javaクライアントコード(わかりやすくするために省略された部分):

    エラートレース(のみ復号フェーズ):

    [main] DEBUG org.apache.ws.security.components.crypto.CryptoFactory - Using Crypto Engine [class org.apache.ws.security.components.crypto.Merlin] 
    [main] DEBUG org.apache.ws.security.util.Loader - Trying to find [clientKeystore.jks] using [email protected]340e class loader. 
    [main] DEBUG org.apache.ws.security.components.crypto.Merlin - The KeyStore clientKeystore.jks of type jks has been loaded 
    [main] DEBUG org.apache.ws.security.processor.TimestampProcessor - Found Timestamp list element 
    [main] DEBUG org.apache.ws.security.message.token.Timestamp - Current time: 2012-02-07T22:52:22.852Z 
    [main] DEBUG org.apache.ws.security.message.token.Timestamp - Timestamp created: 2012-02-07T22:52:22.641Z 
    [main] DEBUG org.apache.ws.security.message.token.Timestamp - Timestamp expires: 2012-02-07T22:57:22.641Z 
    [main] DEBUG org.apache.ws.security.message.token.Timestamp - Validation of Timestamp: Everything is ok 
    [main] DEBUG org.apache.ws.security.message.token.DerivedKeyToken - DerivedKeyToken: created : element constructor 
    [main] DEBUG org.apache.ws.security.message.token.DerivedKeyToken - DerivedKeyToken: created : element constructor 
    [main] DEBUG org.apache.ws.security.processor.ReferenceListProcessor - Found reference list element 
    [main] DEBUG org.apache.ws.security.processor.ReferenceListProcessor - Found data reference: _3 
    [main] DEBUG org.apache.ws.security.processor.X509Util - Sym Enc Algo: http://www.w3.org/2001/04/xmlenc#aes256-cbc 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Getting XMLCipher with transformation 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Constructing XMLCipher... 
    [main] DEBUG org.apache.xml.security.algorithms.JCEMapper - Request for URI http://www.w3.org/2001/04/xmlenc#aes256-cbc 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - cipher._algorithm = AES/CBC/ISO10126Padding 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Initializing XMLCipher... 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - opmode = DECRYPT_MODE 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Processing source element... 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Decrypting element... 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Decrypting to ByteArray... 
    [main] DEBUG org.apache.xml.security.utils.ElementProxy - setElement("KeyInfo", "null") 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Encrypted octets: 
    x1eLqhngbuRTq2XJIkcTdzyu1UFb4eV0kwno04/w4yW0HiY6RyYa7OHqniV63aaxgZPxm0NOK2ZUgjggtkM0O9myJ6ZJOFxCLmqREjQMD+mFW+WuTSEZ5cgc3SFule3MmryqoStNLsmzM8t5yaT3drF1ctT7DJQnV6W858WwpD+Dw+WYmO0RaUlgsfbTnWiBvCZ8yyCzvgmZTMGr8y9LXnwaw+FsspReuMpcIOsqU9LE5u5uW5ZJglgn5cv/8XWikD3TwNzqL+7qAVN8R6WnXgUmb1DuX5lx4cyxlwcLnkfOQKbGrwGvKJUY47ohAgKH 
    [main] DEBUG org.apache.xml.security.algorithms.JCEMapper - Request for URI http://www.w3.org/2001/04/xmlenc#aes256-cbc 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - JCE Algorithm = AES/CBC/ISO10126Padding 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Decrypted octets: 
    <BasicResponse xmlns="http://searchtechnologies.com/cpa/wcfinterop/data"><DateTimeData>0001-01-02T00:00:00</DateTimeData><IntegerData>Integer data</IntegerData><StringData>String data</StringData></BasicResponse> 
    [main] DEBUG org.apache.ws.security.processor.ReferenceListProcessor - Found data reference: _6 
    [main] DEBUG org.apache.ws.security.processor.X509Util - Sym Enc Algo: http://www.w3.org/2001/04/xmlenc#aes256-cbc 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Getting XMLCipher with transformation 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Constructing XMLCipher... 
    [main] DEBUG org.apache.xml.security.algorithms.JCEMapper - Request for URI http://www.w3.org/2001/04/xmlenc#aes256-cbc 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - cipher._algorithm = AES/CBC/ISO10126Padding 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Initializing XMLCipher... 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - opmode = DECRYPT_MODE 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Processing source element... 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Decrypting element... 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Decrypting to ByteArray... 
    [main] DEBUG org.apache.xml.security.utils.ElementProxy - setElement("KeyInfo", "null") 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - Encrypted octets: 
    
    [main] DEBUG org.apache.xml.security.algorithms.JCEMapper - Request for URI http://www.w3.org/2001/04/xmlenc#aes256-cbc 
    [main] DEBUG org.apache.xml.security.encryption.XMLCipher - JCE Algorithm = AES/CBC/ISO10126Padding 
    Feb 07, 2012 4:52:22 PM org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor handleMessage 
    WARNING: 
    org.apache.ws.security.WSSecurityException: The signature or decryption was invalid 
        at org.apache.ws.security.processor.ReferenceListProcessor.decryptEncryptedData(ReferenceListProcessor.java:298) 
        at org.apache.ws.security.processor.ReferenceListProcessor.decryptDataRefEmbedded(ReferenceListProcessor.java:159) 
        at org.apache.ws.security.processor.ReferenceListProcessor.handleReferenceList(ReferenceListProcessor.java:93) 
        at org.apache.ws.security.processor.ReferenceListProcessor.handleToken(ReferenceListProcessor.java:60) 
        at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:396) 
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:249) 
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:85) 
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:799) 
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1627) 
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1494) 
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1402) 
        at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:47) 
        at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:195) 
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:649) 
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533) 
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463) 
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366) 
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319) 
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88) 
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) 
        at $Proxy33.simpleOperation(Unknown Source) 
        at com.searchtechnologies.wcfinterop.TestServiceClient.secureTest(TestServiceClient.java:74) 
        at com.searchtechnologies.wcfinterop.TestServiceClient.main(TestServiceClient.java:32) 
    Caused by: java.lang.ArrayIndexOutOfBoundsException 
        at java.lang.System.arraycopy(Native Method) 
        at org.apache.xml.security.encryption.XMLCipher.decryptToByteArray(Unknown Source) 
        at org.apache.xml.security.encryption.XMLCipher.decryptElement(Unknown Source) 
        at org.apache.xml.security.encryption.XMLCipher.doFinal(Unknown Source) 
        at org.apache.ws.security.processor.ReferenceListProcessor.decryptEncryptedData(ReferenceListProcessor.java:296) 
        ... 26 more 
    
    Feb 07, 2012 4:52:22 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging 
    WARNING: Interceptor for {http://searchtechnologies.com/cpa/wcfinterop}TestService#{http://searchtechnologies.com/cpa/wcfinterop}SimpleOperation has thrown exception, unwinding now 
    org.apache.cxf.binding.soap.SoapFault: The signature or decryption was invalid 
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.createSoapFault(WSS4JInInterceptor.java:643) 
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:308) 
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:85) 
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:799) 
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1627) 
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1494) 
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1402) 
        at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:47) 
        at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:195) 
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:649) 
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533) 
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463) 
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366) 
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319) 
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88) 
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) 
        at $Proxy33.simpleOperation(Unknown Source) 
        at com.searchtechnologies.wcfinterop.TestServiceClient.secureTest(TestServiceClient.java:74) 
        at com.searchtechnologies.wcfinterop.TestServiceClient.main(TestServiceClient.java:32) 
    Caused by: org.apache.ws.security.WSSecurityException: The signature or decryption was invalid 
        at org.apache.ws.security.processor.ReferenceListProcessor.decryptEncryptedData(ReferenceListProcessor.java:298) 
        at org.apache.ws.security.processor.ReferenceListProcessor.decryptDataRefEmbedded(ReferenceListProcessor.java:159) 
        at org.apache.ws.security.processor.ReferenceListProcessor.handleReferenceList(ReferenceListProcessor.java:93) 
        at org.apache.ws.security.processor.ReferenceListProcessor.handleToken(ReferenceListProcessor.java:60) 
        at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:396) 
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:249) 
        ... 21 more 
    Caused by: java.lang.ArrayIndexOutOfBoundsException 
        at java.lang.System.arraycopy(Native Method) 
        at org.apache.xml.security.encryption.XMLCipher.decryptToByteArray(Unknown Source) 
        at org.apache.xml.security.encryption.XMLCipher.decryptElement(Unknown Source) 
        at org.apache.xml.security.encryption.XMLCipher.doFinal(Unknown Source) 
        at org.apache.ws.security.processor.ReferenceListProcessor.decryptEncryptedData(ReferenceListProcessor.java:296) 
        ... 26 more 
    
    [main] ERROR com.searchtechnologies.wcfinterop.TestServiceClient - Error during service invocation 
    java.lang.NullPointerException 
        at com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl.addTextNode(ElementImpl.java:439) 
        at com.sun.xml.internal.messaging.saaj.soap.ver1_2.Fault1_2Impl.setFaultRole(Fault1_2Impl.java:323) 
        at com.sun.xml.internal.messaging.saaj.soap.ver1_2.Fault1_2Impl.setFaultActor(Fault1_2Impl.java:559) 
        at org.apache.cxf.jaxws.JaxWsClientProxy.createSoapFault(JaxWsClientProxy.java:219) 
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:152) 
        at $Proxy33.simpleOperation(Unknown Source) 
        at com.searchtechnologies.wcfinterop.TestServiceClient.secureTest(TestServiceClient.java:74) 
        at com.searchtechnologies.wcfinterop.TestServiceClient.main(TestServiceClient.java:32) 
    

    あなたが見ることができるようにのCxFは、添付ファイルを参照する要素を解読しようとすると、それは、その内容が空で見つけた、と失敗のように、それが見えます。

    すべてのヘルプは深くとなります。

    サイズの制約のためにWSDLを送信できませんでした。必要に応じてリクエストに応じて利用できます。

    よろしく、

    エドゥアルド・キロス・カンポス

  • 答えて

    1

    署名が有効であるとき、私の知る限り知られているように、CXFは完全にMTOMをサポートしていません:それは署名や添付ファイルを暗号化しません。 WCFは添付ファイルに署名または暗号化を行うため、WCFは機能しません。 http://cxf.547215.n5.nabble.com/Signature-digest-mismatch-when-NET-supplies-MTOM-attachment-td3270961.htmlおよびhttps://issues.apache.org/jira/browse/CXF-3687を参照してください。

    関連する問題