我一直在尝试在 IIS 10 中建立一个具有 2 路 SSL 的网站。它并不是那么好。
我已经通过 NameCheap 获得了一个域,并通过 CloudFlare 获得了 DNS(仅限 DNS,无代理)。
服务器具有该域的证书,我通过 Certify with Let's Encrypt 获得了该证书。
在该服务器上,我设置了 AD CS 并使用它来创建证书颁发机构。
CA Web Enrollment 处于活动状态,仅接受来自通过 RRAS 设置的 VPN 连接的请求(我不希望它向 Internet 开放,顺便说一句,VPN 连接使用我之前获得的证书,因此可以正常工作)。
客户端 PC 启动证书并使用 CA Web Enrollment 通过 VPN 将其发送到服务器。然后发出该请求,然后将生成的证书和 CA 分别导入 CurrentUser\My、LocalMachine\TrustedRoot 存储。我还检查了客户端证书是否有私钥。
到目前为止,证书的情况是:
-服务器:CA(LocalMachine\TrustedRoot(无密钥)和LocalMachine\My(密钥)),服务器证书(LocalMachine\My(密钥))。
-客户端:CA(LocalMachine\TrustedRoot(无密钥)),客户端证书(CurrentUser\My(密钥))。
然后是 IIS 配置:服务器上有三个站点。第一个是 certsrv 应用程序的默认应用程序,它只侦听 VPN ip 和 localhost,并且只有带有服务器证书的 HTTPS 处于活动状态(端口均为 443)。第二个是一个 FTP 站点,它只监听 VPN IP 和端口 21。这些无关紧要,我之所以提到它们只是因为我不想遗漏任何东西。
第三个是我们关心的。它侦听域名、任何 ip,并同时激活 HTTP 和 HTTPS(分别使用端口 80 和 443)。HTTP 仅处于活动状态,因此 URL Rewrite 可以将其重定向到 HTTPS,并且 HTTPS 使用服务器证书。
此站点已启用 SSL 要求并根据需要启用客户端证书。
在身份验证中,所有方法都被禁用。
在 system.webServer/security/authentication/iisClientCertificateMappingAuthentication 中,我将 Enabled 设置为 true,并且将 manyToOneCertificateMappingsEnabled 设置为 true。在 manyToOneMappings 中,我有一项映射到服务器上的用户,而在规则中,我有一项带有 certificateField=Issuer、certificateSubField=CN 和 matchCriteria="我创建的 CA 的名称"。
在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 中创建了一个名为 SendTrustedIssuerList 且值为 1 的注册表项。
服务器证书已被删除并重新添加到域中使用 clientcertnegotiation=enabled 在 powershell 中使用 netsh 绑定到站点上的域:443。
最后,我使用https://www.nartac.com/Products/IISCrypto/中的 IISCrypto 在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 中设置协议。
这就是我到目前为止所做的一切,它应该涵盖整个互联网上对类似问题的所有响应,但它所做的只是给我一个 403.7 错误。我在连接尝试期间使用wireshark检查TLS流量,服务器似乎确实发送了带有受信任CA列表的请求证书(我的CA包含在列表中),但我无法让任何浏览器提示我输入客户端证书. 哦忘了提到我确实通过浏览器添加了 CA 和客户端证书,并且 IE 11 有 de 不要提示当您只有一个证书选项被禁用时,但仍然没有。
有任何想法吗?
最后让它工作。IIS 设置正确,问题出在证书上,不知道为什么,但浏览器不喜欢它们。因此,我从服务器中删除了 AD CS,并使用 powershell 重新制作了 CA 和客户端证书。这个新证书运行良好,所有浏览器都会在将它们放在必须去的地方后提示我使用它们。
顺便说一句,powershell 命令如下:
然后,您只需将证书导入客户端计算机上的适当存储。
不知道使用 AD CS 创建的证书中缺少什么,但我很高兴有一个可行的解决方案。