我正在实施需要客户端证书的解决方案。我正在使用 IIS 7.5 和 ASP.Net 4 WCF 服务。
我已将 SSL 设置设置为需要 SSL 并需要客户端证书。到目前为止看起来不错。因为我是第一次使用客户端证书,所以我做了一些研究,并遇到了一个Microsoft 支持文章尝试解释一下客户端证书验证过程。它指出:
当服务器提示输入证书时,请求中会包含服务器信任的证书颁发机构列表。然后,客户端会将此列表与客户端信任的证书颁发机构列表进行比较,并创建匹配的证书颁发机构列表。然后,客户端会将该列表与其拥有的客户端证书进行比较,并确定哪些证书(如果有)是由客户端和服务器都信任的证书颁发机构颁发的。
显然,客户端将发送双方都信任的证书。我感兴趣的是,我是否可以将 IIS 或我的 WCF 服务配置为仅接受某些客户端证书,例如我们从自己的证书颁发机构专门为此 WCF 服务生成的证书。
如何才能阻止某人使用来自 VeriSign 或我们的证书颁发机构的用于其他目的的客户端证书?
答案1
这篇文章假设您已成功设置了一个需要服务器信任的客户端证书的网站。
如果您尚未创建并允许客户端证书,请参阅此文章以在 IIS 和 IIS Express 中创建并允许客户端证书:https://stackoverflow.com/a/57311258/3850405
有人说要使此功能正常工作,IIS Client Certificate Mapping Authentication
需要启用此功能,但我已在 Windows Server 2012 R2 Datacenter 上尝试过此功能,并且它仍然有效。不过,我认为添加此功能很好,而且这是推荐的方法,因此请通过Add Roles and Features
或Turn Windows features on or off
取决于您的操作系统来添加它。
首先在 IIS 管理器中导航到您的站点,然后单击“配置编辑器”。
从那里导航到 Sectionsystem.webServer/security/authentication/iisClientCertificateMappingAuthentication
或简单地将字符串粘贴到 Section 字段中。
设置为 启用True
然后添加oneToOneMappings
。
要获取证书属性的值,请启动 mmc.exe 并导出您的客户端证书。我的证书位于本地计算机的个人证书。
File -> Add or Remove Snap-ins -> Certificates -> Add -> Computer account -> Local computer
Certificates (Local Computer) -> Personal -> Certificates -> Right click on your client certificate -> All tasks -> Export...
当证书导出向导打开时:
- 点击下一步。
- 选择“否,不导出私钥”,然后单击“下一步”。
- 选择 Base-64 编码 X.509 9 (.CER) 作为导出格式,然后单击下一步。
- 选择将证书作为
MyCertificate.cer 保存到桌面,然后单击“下一步”。 - 单击“完成”;您应该会看到一个对话框,提示导出成功。
使用 Windows 记事本打开导出的 MyCertificate.cer 文件:
- 从文本开头删除“-----BEGIN CERTIFICATE-----”。
- 从文本末尾删除“-----END CERTIFICATE-----”。
- 将所有行连接成一行文本。这就是您需要的数据。
我通常使用Notepad++
并删除全部,\r\n
因为我认为这更快。
最后一步是为该计算机/服务器上的用户添加本地用户名和密码。最后它应该看起来像这样。
保存这些值,然后您的网站将需要特定的客户端证书。
答案2
我相信此链接提供了您正在寻找的解决方案。而且它看起来非常详细。我将在接下来的几天内尝试一下,然后会得到我的发现。