当前位置: 首页 > 知识库问答 >
问题:

从soapUI到WCF的WS-Security-绑定和配置

董联
2023-03-14

web服务提供者共享了soap消息的原始xml以突出显示ws-security头。使用soapUI,我已经能够创建完全相同的wsse-Security头,如下所示:

<soapenv:Envelope xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:oas1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
  <soapenv:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <ds:Signature Id="SIG-32" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
          <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
          <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
          <ds:Reference URI="#id-31">
            <ds:Transforms>
              <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                <InclusiveNamespaces PrefixList="oas oas1 urn urn1 urn2 urn3 xd" xmlns="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>ucSFZEOTHpe/IOlPVWtU+1xT4sM=</ds:DigestValue>
          </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
          d4CKqie==
        </ds:SignatureValue>
        <ds:KeyInfo Id="KI-9A8D1F611E86CFB79E144316684667546">
          <wsse:SecurityTokenReference oas:Id="STR-9A8D1F611E86CFB79E144316684667547">
            <wsse:KeyIdentifier 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">5lAB5TaqeFwo23mRVm31LngBT1dQMf94mxeVkyKog==
            </wsse:KeyIdentifier>
          </wsse:SecurityTokenReference>
        </ds:KeyInfo>
      </ds:Signature>

      <oas:Timestamp oas:Id="TS-30">
        <oas:Created>2015-09-25T07:40:46.670Z</oas:Created>
        <oas:Expires>2015-09-26T11:27:26.670Z</oas:Expires>
      </oas:Timestamp>
    </wsse:Security>
  </soapenv:Header>

  <soapenv:Body oas:Id="id-31">
    ...
  </soapenv:Body>
</soapenv:Envelope>

在soapUI中,在“WS-Security Configurations”下,我添加了密钥库(带有我的私有证书的jks)和信任库(带有CA根公钥的jks)。最后,我添加了带有以下设置的“传出WS-Security配置”。

使用此WS-Security设置,soap消息将添加wsse:security,如上图所示。

或者keyidentifierx509subjectkeyidentifier而不是x509v3。例如:

它还在signedinfo下添加了额外的多个引用,即使它通过了模式验证,我也不确定额外的引用在做什么。

internal static Binding GetCustomBinding()
{
    CustomBinding myBinding = new CustomBinding();

    AsymmetricSecurityBindingElement asBindingElement = new AsymmetricSecurityBindingElement();

    //Have tried these also
    //asBindingElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12;
    //asBindingElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
    //WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10

    asBindingElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
    asBindingElement.InitiatorTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.Never };

    asBindingElement.RecipientTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters 
    { 
        //X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier,
        InclusionMode = SecurityTokenInclusionMode.Never
    };


    asBindingElement.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt;
    //asBindingElement.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
    asBindingElement.SecurityHeaderLayout = SecurityHeaderLayout.LaxTimestampLast;
    asBindingElement.EnableUnsecuredResponse = true;
    asBindingElement.IncludeTimestamp = true;
    asBindingElement.SetKeyDerivation(false);
    asBindingElement.DefaultAlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic128Rsa15;

    asBindingElement.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters());

    myBinding.Elements.Add(asBindingElement);

    myBinding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
    //myBinding.Elements.Add(new MtomMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));

    HttpsTransportBindingElement httpsBindingElement = new HttpsTransportBindingElement();
    httpsBindingElement.RequireClientCertificate = true;
    myBinding.Elements.Add(httpsBindingElement);

    return myBinding;
}

此外,我将此行为用于x509证书

<behaviors>
  <endpointBehaviors>
    <behavior name="MyBehavior">
      <clientCredentials>
        <clientCertificate findValue="xxx"
          storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
        <serviceCertificate>
          <defaultCertificate findValue="xxx"
            storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
          <authentication certificateValidationMode="None" revocationMode="NoCheck"
            trustedStoreLocation="LocalMachine" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

共有1个答案

柯瀚玥
2023-03-14
        X509SecurityTokenParameters x509Params = new X509SecurityTokenParameters();
        x509Params.X509ReferenceStyle =
            X509KeyIdentifierClauseType.SubjectKeyIdentifier;
        x509Params.RequireDerivedKeys = false;
        ;
        x509Params.InclusionMode = SecurityTokenInclusionMode.Never;
        x509Params.ReferenceStyle = SecurityTokenReferenceStyle.Internal;
        x509Params.X509ReferenceStyle = X509KeyIdentifierClauseType.Any;
        ((AsymmetricSecurityBindingElement) sec).InitiatorTokenParameters = x509Params;
 类似资料:
  • 问题内容: 我已经从WSDL文件生成了WCF客户端服务代理,该文件调用了第三方Java Web服务。现在,我需要配置绑定和代理来调用Web方法。 但是,我只有以下SOAP信息,用户名和密码以及客户端证书。我该如何解决需要做的事情? 是否有任何“反向配置”应用程序或教授所需技能的网站? 我想我的意思是“消息的这一部分转换为这种配置”。有人可以帮忙吗? 对于同一个项目,我问了这个问题,所以如果有人知道

  • 我需要创建一个wcf客户端来调用一个我无法控制的服务。 我得到了一个wsdl和一个工作中的soapui项目。 该服务同时使用用户名/密码和x509证书。 我用来创建要插入到安全头中的签名块的代码如下所示 其中,xml变量是UsernameToken xml字符串,MySignedXml类是一个子类SignedXml,重写了GetIdElement方法(尝试查找并正确引用不存在的SecurityTo

  • 我使用java配置来配置Spring Security,并定制了AuthenticationProvider和UserDetailsService,以便在http://forum.Spring.io/forum/spring-projects/Security/95715-extrate-login-fields之后添加额外的登录字段 我很难通过使用java配置将这两个定制类添加到Spring S

  • 有问题的webservice的客户机报告说,如果存在此,他们无法生成客户机存根(使用C#)。如何将其更改为?谢了。

  • 有没有办法在SOAPUI(免费)中配置一个测试用例、测试套件甚至项目级的测试中请求使用的资源/方法? 我们有以下用例: 相同的REST服务在不同的服务器上运行(可能是不同的版本),并且根据配置略有不同的资源路径。 例如或等。 我们希望能够针对这些不同的endpoint/资源组合运行我们的测试套件和测试用例。到目前为止,我们发现更改endpoint的唯一方法是在测试用例级别使用测试用例编辑器,并在测

  • 问题内容: 是否有可以调用Windows Communication Foundation(WCF)服务的cpython(不是IronPython)客户端的示例代码? 问题答案: WCF需要通过通信协议公开功能。我认为最常用的协议可能是基于HTTP的SOAP。假设这就是您正在使用的内容。 看看在深入Python这一章。它将向您展示如何进行SOAP调用。 我知道,不管通信协议如何,都没有统一的方法来