繁体   English   中英

如何正确实施客户端证书身份验证?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM