WCF 具有极强的可扩展性,并且具有许多现成的功能,但是我继续在一些主题上苦苦挣扎,并且阅读的文档越多,我就越感到困惑。
我希望从社区中得到一些答案。非常欢迎对任何假设或问题提供反馈。
为了记录:要真正接受一个答案,我应该将这篇文章分成多个问题,但这会导致更多的混乱。我很确定在线上有一些真正的 WCF 专家可以一次性回答本文档中的几个问题,因此我可以接受一个答案作为使用 IIS 正确设置客户端证书身份验证的真正交易。
让我概述一下情况和合作伙伴的要求:
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>
绑定看起来像这样:
它是一个basicHttpBinding强制SOAP1.1(根据合作伙伴的规范)。
<binding name="Soap11CertificateBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
3:在IIS中托管WCF服务和IIS配置
我们在 IIS7 中托管我们的 WCF 服务。我们将服务所在的文件夹配置为需要 SSL 并接受客户端证书。启用身份验证匿名身份验证。
问题是来自合作伙伴的通信有效,我们确信一切正常,但是将 IIS 设置切换为“需要”客户端证书向我们表明,突然之间不再可能成功调用我们的服务。
我是否正确假设以下事情没有正确完成:
serviceBehavior 中的 serviceCerticate 并不是必需的。这是客户端使用的设置。或者是否有必要为服务端点提供此证书信息以匹配客户端发送的证书?
要使 clientcertificate 身份验证在 IIS 中真正起作用,需要将证书映射到用户。应授予此用户对包含服务的文件夹的权限,并且应禁用所有身份验证机制(匿名、Windows 等)。这样 IIS 将处理实际的握手并验证服务通信。还是更多地将证书映射到用户的额外安全问题?
通过在 IIS 上设置“接受”,我们绕过了客户端和服务器之间的实际证书验证。
必须在 IIS 上为保存服务的文件夹禁用所有身份验证机制,如“匿名”和“窗口”。