你能用SoapUI测试证书安全的WCF服务吗?

时间:2012-02-28 08:03:17

标签: wcf biztalk x509certificate soapui

我有一个WCF服务:

  • 使用BasicHttpBinding(如果您能更好地回答WsHttpBinding!)
  • 使用TransportWithMessageCredential安全
  • 使用X.509证书进行传输和邮件安全

我希望能够使用SoapUI测试此服务。

但是,当我尝试这样做时,似乎SoapUI签署的消息比WCF预期的更多,从而导致此错误(在启用ServiceModel审计后在应用程序日志中检测到):

CryptographicException: Unable to resolve the '#id-100' URI in the signature to compute the digest.

或者,当我使用WsHttpBinding时,我得到例外:

MessageSecurityException: The message received over Transport security has unsigned 'To' header.

之前提出过类似的问题:

这不会让我觉得“Java与MS WCF交谈”的问题 - 我有一个Java测试客户端没有问题。同样,我可以使用WCFStorm来测试服务。但是,SoapUI已经成为事实上的测试标准,特别是对于非Windows用户而言。

那么,有没有人设法克服这些问题并使用SoapUI测试证书安全的WCF服务?

由于

我认为这个问题是无法解决的,基于我自己的测试和一个不会得到答案的250赏金。

“web.config”是动态生成的,但它有效地匹配以下任一绑定:

<wsHttpBinding>
    <binding name="WSHttpBinding_ITwoWayAsync" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="250000" maxReceivedMessageSize="250000"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Certificate" proxyCredentialType="None" realm="" />
        <message clientCredentialType="Certificate" negotiateServiceCredential="false"
                 establishSecurityContext="false"
            algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>

 <basicHttpBinding>
    <binding name="BasicHttpBinding_ITwoWayAsync" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="250000" maxReceivedMessageSize="250000"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Certificate" proxyCredentialType="None" realm="" />
        <message clientCredentialType="Certificate"  algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>

3 个答案:

答案 0 :(得分:2)

我有完全相同的问题。我还没有与BasicHttpBinding合作,但确实让它与WsHttpBinding合作。我也有错误The message received over Transport security has unsigned 'To' header。我创建了一个博文来解决这个问题。请参阅博文Connect SoapUI to WCF service certificate authentication以获取更多信息。

您必须在签名中设置部件。默认情况下,SoapUI会对整个请求进行签名,但这不是WCF的默认请求,因此我们必须设置要签名的部分。因此,添加名称“To”,命名空间“http://www.w3.org/2005/08/addressing”(这是我的命名空间,但检查你的)并将Encode设置为“Element”。同时检查请求中的WS-A面板。检查寻址并设置默认值&#34; To&#34;复选框。

答案 1 :(得分:1)

我已经能够在WCF和PFX证书文件中使用自定义绑定。我不得不使用自定义绑定,因为我需要限制对一个证书的访问 - 这超出了这个问题的范围。我的证书pfx文件同时具有公钥和私钥。私钥受密码保护。我无法使用任何其他证书格式进行此项工作。

在SoapUI中,我转到文件 - &gt;偏好 - &gt; SSL设置: - &gt;密钥库名称:path_to_PFX_file - &gt; KeyStore密码:your_private_key_password

以下是我的web.config设置,与basicHttpBinding几乎相同:

<customBinding>
<binding name="MyServiceBindingConfiguration">
   <security authenticationMode="UserNameOverTransport" includeTimestamp="false" requireDerivedKeys="false" securityHeaderLayout="Lax" messageProtectionOrder="SignBeforeEncrypt" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
      <localClientSettings maxClockSkew="00:30:00" />
      <localServiceSettings maxClockSkew="00:30:00" />
      <secureConversationBootstrap />
   </security>
   <textMessageEncoding messageVersion="Soap11">
      <readerQuotas maxDepth="32" maxStringContentLength="524288" maxArrayLength="524288" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
   </textMessageEncoding>
   <httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>

希望这有帮助。

答案 2 :(得分:1)

使用SoapUI这是不可能的,我不得不使用另一个名为WCFStorm的工具。