我一直在与WCF挣扎一段时间,我似乎无法弄明白。 我有一个启用了SSL的自托管WCF服务(使用来自自签名根CA的签名证书),到目前为止一切顺利。该服务用于企业对企业的通信,因此证书似乎是最佳解决方案。
(我目前正在使用WS绑定,但这仅用于开发目的,因为所有绑定方法都支持(据我所知)使用客户端证书的传输级安全性。)
服务的一些相关配置位:
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!-- snip -->
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" />
</clientCertificate>
</serviceCredentials>
当我让客户端使用自签名证书时,该证书位于运行WCF服务的用户的“受信任人”存储中,它将失败。当我使用由我自己的根CA签名的证书时,即使它不在“受信任的人”商店中也可以使用。
我原本以为我可以使用自签名证书,将它们存储在“可信赖的人”商店中,事情就可以了。但是似乎还有一些额外的验证,有些东西我不见了?还有更好的方法吗?
答案 0 :(得分:1)
尽管有“PeerTrust”的验证模式,我仍然在解决同样的问题,即我的自签名客户端证书将被验证,即使它不在“受信任的人”存储中。我终于能够通过使用以下服务行为来限制服务接受仅特定客户端证书:
<behaviors>
<serviceBehaviors>
<behavior ...>
...
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerTrust"
revocationMode="NoCheck"
trustedStoreLocation="LocalMachine" />
<certificate findValue="NameOfClientCertificate"
x509FindType="FindBySubjectName"
storeLocation="LocalMachine"
storeName="TrustedPeople" />
</clientCertificate>
</serviceCredentials>
...
</behavior>
...
身份验证元素和证书元素都需要指向正确的商店,在本例中为“LocalMachine”。
答案 1 :(得分:0)
是的,所以,传输安全性和证书验证是在WCF无法控制的较低级别处理的。因此,使用自定义验证器等所有那些奇特的东西都不能用于传输安全性,只能用于消息安全性。 要在仍使用传输安全性的同时限制客户端访问,您需要设置CTL(证书信任列表)。以下网站应该给你一些指示。
http://www.leastprivilege.com/CertificateBasedAuthenticationAndWCFTransportSecurity.aspx http://viisual.net/configuration/IIS7-CTLs.htm
答案 2 :(得分:0)
我设法使用以下代码行使其工作:
m_host = gcnew WebServiceHost( IService::typeid, baseAddress );
....
m_host->Credentials->ClientCertificate->Authentication->CertificateValidationMode = X509CertificateValidationMode::Custom; //PeerTrust did not work here
m_host->Credentials->ClientCertificate->Authentication->CustomCertificateValidator = System::IdentityModel::Selectors::X509CertificateValidator::PeerTrust;
对我来说似乎是WCF错误。