我有一个WCF服务:
BasicHttpBinding
(如果您能更好地回答WsHttpBinding
!)TransportWithMessageCredential
安全我希望能够使用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>
答案 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的工具。