在与WCF服务通信时,我希望使用基于证书的加密和验证。因此,我创建了测试证书,"TempCA“作为我的根CA,"SignedByCA”作为由该CA签名的客户端证书。
当我将客户端证书放入“本地计算机\受信任的人”并使用certificateValidationMode="PeerTrust"时,服务会识别客户端,一切都按预期工作。但是,通过信任链验证(certificateValidationMode="ChainTrust"),我遇到了“调用方没有通过服务进行身份验证”的错误。
相关服务器端配置:
<behaviors>
<serviceBehaviors>
<behavior name="customServiceBehavior">
[...]
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="ChainTrust" trustedStoreLocation="LocalMachine" mapClientCertificateToWindowsAccount="false" />
</clientCertificate>
<serviceCertificate findValue="TempCA"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="soapBindingConfiguration">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>相关客户端配置 (rest自动创建,由“添加服务引用”):
<endpointBehaviors>
<behavior name="customClientBehavior">
<clientCredentials>
<clientCertificate findValue="SignedByCA" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>客户端和服务器证书都以私钥存储在“本地计算机\Personal”中(因为我正在一台计算机上进行测试),"TempCA“(我的根证书)也存储在”本地计算机\受信任的根证书颁发机构“中。
我在这里错过了什么?有什么有用的例子吗?
发布于 2011-09-08 10:54:43
我终于发现了问题所在。撤销检查必须被禁用。我的测试CA显然没有相关的CRL,因此在这种情况下,WCF似乎阻止了每个客户端,因为它无法被验证。
<clientCertificate>
<authentication certificateValidationMode="ChainTrust"
revocationMode="NoCheck" ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
[...] />
</clientCertificate>发布于 2011-09-07 12:57:33
看起来,您所做的工作应该基于这篇MSDN文章,在WCF中使用证书。使用受信任的根证书方法时,您可能希望从个人存储中删除证书。
如果这也不起作用,那么部署根证书还需要将组策略应用到您的计算机上。查看这篇TechNet文章。的“如果您不使用Microsoft证书颁发机构并且只想要一组计算机”部分,它指出,如果没有应用组策略,计算机可能不会自动信任根证书。这两篇文章似乎相互矛盾,所以我不确定哪一篇会有用。
https://stackoverflow.com/questions/7329711
复制相似问题