如何以正确的方式实现客户端证书身份验证?

时间:2013-01-18 21:10:07

标签: wcf authentication iis client-certificates

WCF具有极强的可扩展性,并且具有许多现成可用的功能,但是我继续在某些主题上苦苦挣扎,而且我阅读的文档越多,我就越感到困惑。

我希望从社区得到一些答案。对任何假设或问题的反馈都非常受欢迎。

为了记录:要真正接受一个答案,我应该将这个帖子分成多个问题,但这会导致更多的混乱。 我很确定在线有一些真正的WCF专家可以一次性回答本文档中的几个问题所以我可以接受一个答案作为使用IIS以正确的方式设置clientcertificate身份验证的真正优惠。

让我描述一下情况和合作伙伴的要求:

1:合作伙伴要求和使用客户证书的问题。

合作伙伴X需要在我的后端调用API,他们明确要求使用Clientcertificate身份验证。 他们创建了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并不是必需的。这是客户端使用的设置。或者是否有必要为服务端点提供此证书信息以匹配客户端发送的证书?

  • 要使clientcertificate身份验证在IIS中真正起作用,需要将证书映射到用户。应该授予此用户对包含服务的文件夹的权限,并且应禁用所有身份验证机制(匿名,Windows,...)。 这样,IIS将处理实际的握手并验证服务通信。 或者更多的是将证书映射到用户的额外安全性问题?

    • 通过在IIS上设置“接受”,我们绕过了客户端和服务器之间的实际证书验证。

    • 必须在IIS上为包含服务的文件夹禁用所有身份验证机制,如“匿名”和“Windows”。

1 个答案:

答案 0 :(得分:2)

在您的方案中,您不需要在WCF中配置证书,IIS会为您处理这些证书。您可以清除整个<serviceCredentials>块,因为:

<serviceCertificate> of <serviceCredentials>指定一个X.509证书,该证书将用于使用您未使用的邮件安全模式对客户端进行身份验证,以及<clientCertificate> of <serviceCredentials>定义一个X.509证书,用于以双工通信模式对客户端的消息进行签名和加密。

请参阅here如何将客户端证书映射到用户帐户。