连接到启用了双向 SSL 的 Web 服务器时,任何浏览器均不会提示输入证书,并返回 403.7 错误

连接到启用了双向 SSL 的 Web 服务器时,任何浏览器均不会提示输入证书,并返回 403.7 错误

我一直在尝试在 IIS 10 中建立一个具有双向 SSL 的网站。但进展不太顺利。

我已经有一个通过 NameCheap 获得的域名,并且通过 CloudFlare 拥有 DNS(仅 DNS,无代理)。

该服务器具有该域的证书,该证书是我通过 Let's Encrypt 认证获得的。

在该服务器上,我设置了 AD CS 并使用它来创建证书颁发机构。

CA Web 注册处于活动状态,并且仅接受通过 RRAS 设置的 VPN 连接的请求(我不希望它开放到互联网,顺便说一下,VPN 连接使用我之前获得的证书,因此它工作正常)。

客户端 PC 启动证书并通过 VPN 使用 CA Web 注册将其发送到服务器。然后发出该请求,并将生成的证书和 CA 分别导入到 CurrentUser\My、LocalMachine\TrustedRoot 存储中。我还检查了客户端证书是否有私钥。

到目前为止证书的情况是:

-服务器:CA(LocalMachine\TrustedRoot(无密钥)和 LocalMachine\My(密钥)),服务器证书(LocalMachine\My(密钥))。

-客户端:CA(LocalMachine\TrustedRoot(无密钥))、客户端证书(CurrentUser\My(密钥))。

然后是 IIS 配置:服务器上有三个站点。第一个是带有 certsrv 应用程序的默认站点,该站点仅侦听 VPN ip 和本地主机,并且仅使用服务器证书激活 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 的名称" 设置为 true。

在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 中创建了一个名为 SendTrustedIssuerList 的注册表项,其值为 1。

删除了服务器证书,并使用 powershell 中的 netsh 将 clientcertnegotiation=enabled 重新添加到站点上的 domain:443 绑定。

最后,我使用了 IISCryptohttps://www.nartac.com/Products/IISCrypto/在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 中设置协议。

到目前为止,我所做的就是这些,它应该涵盖了互联网上对类似问题的所有响应,但它所做的只是给我一个 403.7 错误。我在连接尝试期间使用 wireshark 检查 TLS 流量,服务器似乎确实发送了带有受信任 CA 列表的请求证书(我的 CA 包含在列表中),但我无法让任何浏览器提示我输入客户端证书。哦,忘了说我确实通过浏览器添加了 CA 和客户端证书,IE 11 已将“当您只有一个证书时不提示”选项禁用,但仍然没有。

有任何想法吗?

答案1

最后终于成功了。IIS 设置正确,问题出在证书上,不知道为什么,但浏览器不喜欢它们。所以我从服务器上删除了 AD CS,并使用 powershell 重新制作了 CA 和客户端证书。这些新证书工作正常,在将它们放到应放置的位置后,所有浏览器都会提示我输入证书。

顺便说一下,powershell 命令如下:

$params = @{
   DnsName = "CA Name"
   KeyLength = 2048
   KeyAlgorithm = 'RSA'
   HashAlgorithm = 'SHA256'
   KeyExportPolicy = 'Exportable'
   NotAfter = (Get-Date).AddYears(5)
   CertStoreLocation = 'Cert:\LocalMachine\My'
   KeyUsage = 'CertSign','CRLSign'
}

$rootCA = New-SelfSignedCertificate @params

Export-Certificate -Cert $rootCA -FilePath "C:\path\to\file\ca-public.crt"

Import-Certificate -CertStoreLocation 'Cert:\LocalMachine\Root' -FilePath "C:\path\to\file\ca-public.crt"

$params = @{
   Subject = "Client Name"
   Signer = $rootCA
   KeyLength = 2048
   KeyAlgorithm = 'RSA'
   HashAlgorithm = 'SHA256'
   KeyExportPolicy = 'Exportable'
   NotAfter = (Get-date).AddYears(5)
   CertStoreLocation = 'Cert:\LocalMachine\My'
}

$clientCert = New-SelfSignedCertificate @params

Export-PfxCertificate -Cert $clientCert -FilePath "C:\path\to\file\client-private.pfx" -Password (ConvertTo-SecureString -AsPlainText 'password' -Force)

然后您只需将证书导入到客户端计算机上的适当存储中。

不知道使用 AD CS 创建的证书缺少什么,但我很高兴有一个可行的解决方案。

相关内容