[英]Service client with Mutual Authentication (2-way client certificate authentication)
[英]How do I implement Client Certificate authentication the right way?
WCF具有极强的可扩展性,并且具有许多现成的功能,但是我仍然在为某些主题而苦苦挣扎,阅读的文档越多,我就越会感到困惑。
我希望能从社区中得到一些答案。 非常欢迎任何假设或问题的反馈。
记录:要真正接受一个答案,我应该将此帖子分为多个问题,但这会导致更多的混乱。 我敢肯定,有一些真正的WCF在线专家可以同时回答本文档中的几个问题,因此我可以接受一个单独的答案作为使用IIS正确设置客户端证书身份验证的真正方法。
让我概述一下情况和合作伙伴的要求:
1:合作伙伴要求和使用客户证书的问题。
合作伙伴X需要在我的后端调用API,并且明确要求使用Clientcertificate身份验证。 他们创建了客户证书,并仅向我们提供了带有公钥的证书,因为似乎只有逻辑上,他们才将私钥实际上保持私有并保存在自己的系统中。 证书已导入本地计算机帐户,并查看证书路径是否有效。 所有中间证书颁发机构以及最终的根证书颁发机构都是受信任的。
2:我们的WCF 服务器端配置
我有这样配置的serviceBehavior:
<behavior name="ClientCertificateBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceCredentials>
<serviceCertificate findValue="<serialnumber here>" x509FindType="FindBySerialNumber" />
<clientCertificate>
<authentication certificateValidationMode="PeerTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
我想我在这里犯了第一个错误,应该使用ChainTrust通过其证书路径实际验证证书 。 你怎么看?
该服务配置如下:
<service behaviorConfiguration="ClientCertificateBehavior" name="<Full service namespace and servicename>">
<endpoint binding="basicHttpBinding" bindingConfiguration="Soap11CertificateBasicHttpBinding"
contract="<The interface>"></endpoint>
</service>
绑定看起来像这样:
它是强制SOAP1.1的basicHttpBinding(根据合作伙伴的规范)。
<binding name="Soap11CertificateBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
3:在IIS和IIS配置中托管WCF服务
我们在IIS7中托管WCF服务。 我们将服务所在的文件夹配置为需要SSL并接受客户端证书。 启用了基于身份验证的匿名身份验证。
事实是,与合作伙伴的通信是有效的,并且我们确信一切都很好,但是将IIS设置切换为“需要”客户端证书,这表明我们突然无法成功调用我们的服务。
我是否正确地假设以下事情未正确完成:
真正不需要serviceBehavior中的serviceCerticate。 这是客户端使用的设置。 还是有必要为服务端点提供此证书信息,以匹配客户端发送的证书?
为了使客户端证书身份验证真正在IIS中有效,需要将证书映射到用户。 应该为该用户授予包含服务的文件夹的权限,并且应禁用所有身份验证机制(匿名,Windows等)。 这样,IIS将处理实际的握手并验证服务通信。 还是将证书映射到用户需要额外的安全性?
通过在IIS上设置“接受”,我们绕过了客户端和服务器之间的实际证书验证。
必须在IIS上禁用用于保存服务的文件夹的所有身份验证机制,例如“匿名”和“窗口”。
在您的方案中,您不需要在WCF中配置证书,IIS会为您处理那些证书。 您可以清除整个<serviceCredentials>
块,因为:
<serviceCertificate>
的<serviceCredentials>
指定一个X.509证书,该证书将用于使用您不使用的消息安全性模式向客户端验证服务,而<serviceCredentials>
的<clientCertificate>
<serviceCredentials>
定义一个X.509证书。用于以双工通信模式对发送给客户端的消息进行签名和加密,从而形成一种服务。
请参阅此处如何将客户端证书映射到用户帐户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.