几个星期以来,我一直在尝试让我们正在创建的 Web 服务要求客户端证书才能进行连接,但一直没有成功。我想我会尝试制作一个需要客户端证书的简单网站,以便从方程式中删除所有额外的 Web 服务代码。尽管所有在线教程都让这个过程看起来要简单得多,但我仍然没有成功。我不确定我是否缺少 IIS 中的设置,或者只是没有安装某些东西。
服务器是 Windows Server 2008 Web Edition。我的本地客户端是 Windows 7。
我详细说明了创建此测试网站所采取的每个步骤。
首先我必须创建我的测试证书。从本地计算机上的 Windows 7 SDK 7.1 命令提示符,我运行了以下命令:
makecert.exe -r -n "CN=My Personal CA" -pe -sv MyPersonalCA.pvk -a sha1 -len 2048 -cy authority MyPersonalCA.cer
makecert.exe -iv MyPersonalCA.pvk -ic MyPersonalCA.cer -n "CN=John Doe" -pe -sv JohnDoe.pvk -a sha1 -len 2048 -sky exchange JohnDoe.cer -eku 1.3.6.1.5.5.7.3.2
pvk2pfx.exe -pvk JohnDoe.pvk -spc JohnDoe.cer -pfx JohnDoe.pfx -po password
执行这些命令后,我得到了以下文件:
MyPersonalCA.cer
MyPersonalCA.pvk
JohnDoe.cer
JohnDoe.pfx
JohnDoe.pvk
然后,我将以下内容导入到本地计算机上的 IE 中(工具->Internet 选项->内容->证书导入):将 JohnDoe.pfx 导入“个人”存储区(在“高级”中确保已选择“客户端身份验证”)将 MyPersonalCA.cer 导入“受信任的根证书颁发机构”存储区
在服务器上,我使用 MMC 证书管理单元导入了以下证书:
JohnDoe.cer into [Local Computer\Personal] and [Current User\Personal]
MyPersonalCA.cer into [Local Computer\Trusted Root Certification Authorities] and
[Current User\Trusted Root Certification Authorities]
我创建了一个空白的 VB.NET (VS2008) Web 应用程序并将其部署到服务器。在 IIS 中,我将此应用程序分配给以管理员身份运行的应用程序池,以避免任何权限问题(是的,我稍后会修复此问题)。
在 IIS 中,我像这样更改应用程序的 SSL 设置:
Check "Require SSL"
Under "Client Certificates", select "Require"
我还将 403.7 和 403.5 错误分配给自定义错误页面,这样我就能知道我遇到了哪个 403 错误。
IE 应该在进入页面时提示选择客户端证书。由于较新版本的 IE 不会在没有匹配证书的情况下提示,所以我找到了一个装有 IE6 的旧盒子,在那个盒子上(安装了证书),我确实得到了客户端证书对话框,但没有列出任何证书。我的开发人员盒子上的 IE10 从未打开提示。我只是立即得到 403.7
有人能告诉我我哪里出错了吗? IIS 是否需要额外的设置才能正常工作?
在提交这个问题时,我偶然发现了另一篇讨论 MakeCTL 和 netssh 的帖子。从中我发现,如果我运行:
netssh http show sslcert
我得到了一个设置列表,其中包括:
Negotiate Client Certificate : Disabled
需要启用此功能吗?如果需要,我该如何启用它?我找到的有限说明听起来好像我需要删除 SSL 绑定并重新添加。由于服务器正在使用中,我不太愿意尝试这个。
答案1
我遇到了类似的错误,我添加到本地计算机的受信任根 CA 的自签名客户端证书未被接受。我通过应用此处描述的修复程序解决了此问题:https://support.microsoft.com/en-au/kb/2801679
简而言之,如果您信任的根 CA 列表中的证书过多,则呈现给调用者的可接受根证书列表将被截断。如果您运气不好,则所需的根证书未包含在内,系统将得出您没有任何可接受证书的结论。您可以通过在 IIS 服务器的系统事件日志中查找由“Schannel”发出的警告(事件代码为 36885)来诊断此问题。修复方法是删除注册表项... 上述 MS 链接中有更多详细信息。