2013-09-06 4 views
1

저는 WCF 전문가가 아니며 단지 서비스 보안의 기초 만 알고 있으므로 아마도 대부분의 것들이 잘못 될 것입니다. 그렇다면 SOAP 헤더의 특정 형식을 요구하는 3D 파티 서비스를 호출해야합니다. 들은 SOAP 헤더를 제공 할 것을 요구 : 1) 타임 스탬프 블록 2) 바이너리 토큰 3)은 암호화 된 데이터의 일부 (검사)들은 날 요청이 exemple를 제공 ​​한BinarySecurityToken을 사용하여 X.509 인증서를 통해 보안 된 WCF

다이제스트 (나는했습니다 의미있는 부분을 제거했습니다.)

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Header> 
    <wsse:Security 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"> 
     <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" 
           wsu:Id="...omissis..."> 
     </wsse:BinarySecurityToken> 

     <ds:Signature Id="SIG-6" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
     <ds:SignedInfo> 
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
      <ec:InclusiveNamespaces PrefixList="S" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
      </ds:CanonicalizationMethod> 
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
      <ds:Reference URI="#TS-5"> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
       <ec:InclusiveNamespaces PrefixList="wsse S" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
       </ds:Transform> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
      <ds:DigestValue>...omissis...</ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue> 
      .... 
      ...omissis... 
      .... 
     </ds:SignatureValue> 
     <ds:KeyInfo Id="KI-...omissis..."> 
      <wsse:SecurityTokenReference wsse11:TokenType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" wsu:Id="STR-...omissis..." xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"> 
      <wsse:Reference URI="#X509-...omissis..." ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1"/> 
      </wsse:SecurityTokenReference> 
     </ds:KeyInfo> 
     </ds:Signature> 
     <wsu:Timestamp wsu:Id="TS-5"> 
     <wsu:Created>2013-03-27T15:10:18.523Z</wsu:Created> 
     <wsu:Expires>2013-03-27T15:26:58.523Z</wsu:Expires> 
     </wsu:Timestamp> 
    </wsse:Security> 
    </S:Header> 
<S:Body> 
    ...clear (not encrypted) body of the soap request 
</S:Body> 
</S:Envelope> 

그들은 WSDL과 xsd도 받았습니다. 내가 한 것은 wsdl을 서비스 참조로 사용하여 새로운 웹 응용 프로그램을 만드는 것이 었습니다. 의 Web.config를 확인, 나는이이

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="CPBinding"> 
      <security mode="Transport" /> 
     </binding> 
     <binding name="CPBinding1" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://...omissis" 
     binding="basicHttpBinding" bindingConfiguration="CPBinding" 
     contract="BTClient.CPCUVPortType" name="CPCUVPort" /> 
    </client> 
    </system.serviceModel> 

같은은 BasicHttpBinding을 만들었다 고 볼 수 있지만이 보안 정책의 어떤 종류를 사용하지 않는 바인딩, 그래서 내가 계정에 걸리는 행동을 만들었습니다 그와 같은 인증서 (상호 인증서의 경우)

<behaviors> 
     <endpointBehaviors> 
     <behavior name="CustomBehaviorForCertificates"> 
      <clientCredentials> 
      <clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="...omissis..." /> 
      <serviceCertificate> 
       <scopedCertificates> 
       <add targetUri="https://...omissis..." storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindByThumbprint" findValue="...omissis..." /> 
       </scopedCertificates> 
       <authentication certificateValidationMode="PeerTrust" revocationMode="NoCheck" /> 
      </serviceCertificate> 
      </clientCredentials> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

그리고 바인딩에서이를 참조하십시오. 커스텀 Inspector의 BeforeSendRequest 메서드를 사용하여 보내는 메시지를 검사함으로써 인증서가 완전히 무시되고 비 행동 (be-behavior) 요청과 동일한 요청을 보내는 것을 볼 수 있습니다. 이처럼 내 요청에 3D 자 서비스의 대답은 : 나는 customBinding를 구현해야 요청한

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header> 
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsu:Timestamp wsu:Id="Timestamp-..." xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsu:Created>2013-09-06T14:31:28Z</wsu:Created> 
     <wsu:Expires>2013-09-06T14:36:28Z</wsu:Expires> 
     </wsu:Timestamp> 
     <wsse:BinarySecurityToken wsu:Id="SecurityToken-...." EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     ...omissis... 
     </wsse:BinarySecurityToken> 
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <SignedInfo> 
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
      <Reference URI="#Timestamp-..."> 
      <Transforms> 
       <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
      <DigestValue>...omissis...</DigestValue> 
      </Reference> 
     </SignedInfo> 
     <SignatureValue>...omissis...</SignatureValue> 
      <KeyInfo> 
       <wsse:SecurityTokenReference xmlns=""> 
        <wsse:Reference URI="#SecurityToken-...omissis..." ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" /> 
       </wsse:SecurityTokenReference> 
      </KeyInfo> 
     </Signature> 
    </wsse:Security> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body wsu:Id="..." xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <SOAP-ENV:Fault> 
     <faultcode>wsse:FailedCheck</faultcode> 
     <faultstring>The signature or decryption was invalid</faultstring> 
     <detail> 
     <e:myfaultdetails xmlns:e="Some-URI"> 
      <errorCode>500</errorCode> 
      <message>INTERNAL_SERVER_ERROR</message> 
     </e:myfaultdetails> 
     </detail> 
    </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

몇 가지 조사를 수행 한 후 나는 BinarySecurityToken을 제공하는 것을 읽었습니다. 나는 다른 접근법과 조합을 시도했지만 항상 진전을 이루지 못합니다. 예를 들어,이 사용자 정의 동작을 사용하여

:

<customBinding> 
    <binding name="cb"> 
     <security authenticationMode="MutualCertificateDuplex" requireDerivedKeys="false" includeTimestamp="true" 
     messageProtectionOrder="EncryptBeforeSign" messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10" /> 
     <textMessageEncoding messageVersion="Soap11" /> 
     <httpsTransport /> 
    </binding> 
    </customBinding> 

나는 다음과 같은 내부 서버 오류가 나타날 수

ExceptionType: System.ServiceModel.Security.MessageSecurityException: An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.InnerException: System.ServiceModel.FaultException:Internal Error 

하고, 가장 중요한 ... 보내는 요청이 항상 동일 basicHttpBinding 중 하나! 분명히 나는 ​​뭔가를 잘 이해하지 못했습니다. 나는 basicHttpBindig를 사용하여 그것들과 정확하게 통신 할 수 있음을 알 수 있지만 필요한 보안 단편을 제공하지 못한다. 다른 왕 바인딩 (예 : wsHttpBinding 또는 customBinding)을 사용하려고하면 오류 메시지가 나타납니다. 누군가 이러한 일을 수행하는 올바른 방법을 이해하는 데 도움을 줄 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

고마워요.

편집 :

내가 나가는 요청 추가 해요 :에 명시된 바와 같이 (오류로 인해 는 사실 내가 성공적으로 원격 서비스를 호출 할 수 없습니다 :

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Header> 
    <ActivityId CorrelationId="dd479557-7e51-41de-822b-d2ac669ff827" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">bbd2f92b-33d5-4ec0-87b6-690f2142cdf5</ActivityId> 
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <u:Timestamp u:Id="uuid-7b22e181-f551-4821-91e0-cf8c9b8d9eef-1"> 
     <u:Created>2013-09-09T12:24:03.563Z</u:Created> 
     <u:Expires>2013-09-09T12:29:03.563Z</u:Expires> 
     </u:Timestamp> 
     <o:BinarySecurityToken> 
     <!-- Removed--> 
     </o:BinarySecurityToken> 
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <SignedInfo> 
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod> 
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod> 
      <Reference URI="#_1"> 
      <Transforms> 
       <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod> 
      <DigestValue>...omissis...</DigestValue> 
      </Reference> 
      <Reference URI="#uuid-7b22e181-f551-4821-91e0-cf8c9b8d9eef-1"> 
      <Transforms> 
       <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod> 
      <DigestValue>...omissis...=</DigestValue> 
      </Reference> 
     </SignedInfo> 
     <SignatureValue>...omissis...</SignatureValue> 
     <KeyInfo> 
      <o:SecurityTokenReference> 
      <o:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#uuid-e31a3eed-6ac7-4dcb-bfb2-2384764acd93-2"></o:Reference> 
      </o:SecurityTokenReference> 
     </KeyInfo> 
     </Signature> 
    </o:Security> 
    </s:Header> 
    <s:Body u:Id="_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CPCUValidityRequest xmlns="http://......omissis..."> 
     <serviceType>3</serviceType> 
     <arg1>arg1</arg1> 
     <arg2>arg2</arg2> 
     ...omissis... 
    </CPCUValidityRequest> 
    </s:Body> 
</s:Envelope> 

솔루션을 의견을 수락 된 솔루션에.하지만 나는이 질문은 내가 요구 한 것과 거의 비슷한 요청을 만들었 기 때문에 대답되었다고 말할 수있다 .Yaron에게 많은 감사를 전한다.

추신 : 유사한 문제가있는 사람들을위한 힌트, 나가는/들어오는 요청을 확인하려면 Microsoft 추적 뷰어를 사용해보십시오.이 대답에 제안 된대로 추적을 사용하십시오 (https://stackoverflow.com/a/11678740/2274007의 조언을 따르십시오. 의견))

답변

2

발신 요청을 게시하십시오. 귀하의 바인딩에서 나는 authenticationMode = "mutualCertificate"로 변경됩니다. 그렇지 않으면 좋아 보인다.

단지 서명 된 메시지를 전송하기 위해 또한

하지 암호화 한 데이터 계약의 상단에이 속성을 추가 (reference.cs) :이 wcf security tips 문서의이 방법에

[System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.SimpleServiceSoap", ProtectionLevel=System.Net.Security.ProtectionLevel.Sign)] 

자세한 내용.

+0

덕분에, 내가 질문을 업데이 트했습니다. 나는 당신의 수정을 시도하고 최대한 빨리 알려 드리겠습니다. – Gnegno

+0

나는 귀하의 블로그 게시물을 읽고 있습니다 ... 정말 대단합니다. 이제 마침내 뭔가를 이해할 수 있습니다 ... 감사합니다.) – Gnegno

+1

보내는 요청에 보안이 없습니다. 하나의 옵션은 wcf 로그의 잘못된 위치에서 요청을 도구로 처리 한 후 확보하는 것입니다. 피들러를 사용하거나 통나무에서 수송 단계를 가져 가십시오. 또 다른 옵션은 바인딩 구성이 엔드 포인트에 적용되지 않는다는 것입니다. 아마도 구성 오타입니다. –

0

이 customBinding을보십시오 : 귀하의 답변에 대한

<customBinding> 
    <binding name="cb"> 
     <security authenticationMode="MutualCertificateDuplex" 
       defaultAlgorithmSuite="Basic128Rsa15" 
       requireDerivedKeys="false" 
       enableUnsecuredResponse="true" 
       messageProtectionOrder="EncryptBeforeSign" 
       messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"> 
     </security> 
     <textMessageEncoding messageVersion="Soap11WSAddressing10"/> 
    <httpsTransport /> 
    </binding> 
    </customBinding>