我有一个关于 WCF 的证书/安全问题,但我缺乏对证书的理解,所以这对我来说很难。我相信有更多经验的人可以提供帮助:) 我得到的 .net 错误是 SecurityNegotiationException:错误: 无法为具有权限“[3rd party web service address]”的 SSL/TLS 安全通道建立信任关系
如果您无法提供确切的 WCF 配置,那么如果您能帮助我更好地了解我正在使用的证书/PFX 的目的/类型,那将非常有用。或者,如果您有任何故障排除想法 - 我很乐意尝试它们以最好地解决这个问题。
如何验证我附加的证书与soapUI 的证书相同?我打算使用 Fiddler 来比较请求,但是遇到了不同的问题,即没有为soapUI 和.net 捕获的问题,由于某种原因它没有向我显示 xml 请求。
更多详细信息
无论如何,进入场景:我正在与第 3 方打交道,为了在浏览器中启动他们的 Web 服务,我需要将他们的 WS.cert 安装在我信任的本地计算机根目录中。
我在soapUI 中给出了一个工作示例,它适用于第3 方的服务。出于某种原因,我收到了 2 个 pfx 文件(a.pfx 和 b.pfx - 通道证书?),我不完全确定每个文件的类型或目的,但soapUI 需要这两个文件才能工作。我有他们告诉我的消息签名证书-a.pfx,我将其设置如下:
在此处添加名称为 a.pfx:soapUI 项目 > 属性 > WS-Security 配置 > 密钥库/证书。
在soapUI project > properties > WS-Security Configurations > Outgoing WS-Security Configurations下,我添加了“ws”的配置。为此,我添加了一个具有以下设置的 WSS 条目(类型:签名):
密钥库:a.pfx 密钥标识符类型:二进制安全令牌 签名算法:http://www.w3.org/2000!09:smldsig#rsa-sha1 签名规范化:http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments 摘要算法:http://www.w3.org/2000/09/xmldsig#sha1 使用单一证书:[选中此框] 使用单一证书进行签名 零件:空白
b.pfx 如何发挥作用是在 soapUI > File > Preferences > SSL Settings KeyStore:添加 b.pfx 并适当填写 KeyStore 密码。但同样,我不确定这是什么以及如何将它带入 WCF。
到目前为止,我的配置尝试看起来像这样
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<!--Configure the Client Certificate on the client:
http://msdn.microsoft.com/en-us/library/ff648360.aspx#Step8 -->
<behavior name="myBehavior">
<clientCredentials>
<clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint"
findValue="40 char hex thumbprint - removedBeforePosting. Points to b.pfx" />
<serviceCertificate>
<defaultCertificate storeLocation="LocalMachine" storeName="Root" x509FindType="FindByThumbprint"
findValue="40 char hex thumbprint - removedBeforePosting. Points to WS.cert" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="myServiceBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="Transport">
<!--I believe the transport also needs Certificate because you can't bring up their ws in a browser w/o their cert -->
<transport clientCredentialType="Certificate" proxyCredentialType="None" realm=""/>
<message clientCredentialType="Certificate" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://thirdparty.com:443/Service" behaviorConfiguration="myBehavior" binding="basicHttpBinding" bindingConfiguration="myServiceBinding" contract="ThirdPartyService.IThirdPartyService" name="ThirdPartyService_V2_Port">
<identity>
<certificateReference storeLocation="LocalMachine" storeName="My"
x509FindType="FindByThumbprint" findValue="40 char hex thumbprint - removedBeforePosting. Points to a.pfx" />
<!--<certificate encodedValue="QW4k8wz/BGqIfu2pi0OAyjfQJ5cRiiLk" />-->
<!--tHhfDw/gHv27z52lyMrm4JjP76c=-->
</identity>
</endpoint>
</client>
</system.serviceModel>