我正在尝试在IIS 8上实现客户端证书身份验证。我已在开发计算机上部署了我的配置,并验证它在那里按预期工作。但是,在服务器上进行设置后,每当我导航到该站点并提示您输入客户端证书时,我都会选择它并立即收到403.16错误。失败的请求日志提供错误代码2148204809和消息"已处理证书链,但终止于信任提供程序不信任的根证书。"
我有一个有效的客户端证书和一个有效的CA证书。 CA证书安装在服务器和客户端计算机上计算机帐户的受信任的根颁发机构中,客户端证书安装在客户端计算机上当前用户帐户的个人区域中。
客户端证书由根CA直接签名,正如我所说,两者都有效。链中没有其他证书,并且“受信任的根权限”区域中没有中间证书。
IIS配置已启用sslFlags = SslNegotiateCert并启用了iisClientCertificateMappingAuthentication。
服务器未配置为发送CTL,我们有SendTrustedIssuerList = 0.
我不明白为什么不应该信任客户端证书。
答案 0 :(得分:75)
Windows 2012引入了更严格的证书存储验证。根据{{3}},受信任的根证书颁发机构(即根)商店只能拥有自签名的证书。如果该存储包含非自签名证书,则IIS下的客户端证书身份验证将返回403.16错误代码。
要解决此问题,您必须从根存储中删除所有非自签名证书。此PowerShell命令将标识非自签名证书:
Get-Childitem cert:\LocalMachine\root -Recurse |
Where-Object {$_.Issuer -ne $_.Subject}
在我的情况下,我们将这些非自签名证书移至中级证书颁发机构(即CA)商店:
Get-Childitem cert:\LocalMachine\root -Recurse |
Where-Object {$_.Issuer -ne $_.Subject} |
Move-Item -Destination Cert:\LocalMachine\CA
根据KB 2795828: Lync Server 2013 Front-End service cannot start in Windows Server 2012,您可能还有太多可信证书。
[T] Schannel安全包支持的可信证书颁发机构列表的最大大小为16千字节(KB)。拥有大量第三方根证书颁发机构将超过16k的限制,您将遇到TLS / SSL通信问题。
此情况下的解决方案是删除您不信任的任何证书颁发机构证书,或KB 2801679: SSL/TLS communication problems after you install KB 931125(默认情况下,如果不存在,则为1)。
答案 1 :(得分:4)
就我而言,我一直在将根证书添加到“当前用户”中。证书存储在服务器上,并得到403.16错误。
将我的根证书添加到本地计算机的受信任的根颁发机构存储解决了该问题。
在运行IIS的服务器上执行以下步骤。
对于Windows Server 2008 R2:
对于Windows Server 2012 R2:
对于Windows 7:
答案 2 :(得分:0)
我在IIS Express中遇到此错误:
HTTP错误403.16 - 禁止
您的客户端证书不受信任或无效。
查看TraceLogFiles
我看到以下错误:
<RenderingInfo Culture="en-US">
<Opcode>MODULE_SET_RESPONSE_ERROR_STATUS</Opcode>
<Keywords>
<Keyword>RequestNotifications</Keyword>
</Keywords>
<freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>
<freb:Description Data="ErrorCode">A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
(0x800b0109)</freb:Description>
</RenderingInfo>
当我安装Razer Synapse
时,安装时还会在计算机帐户下的受信任的根证书颁发机构中为chromasdk.io
放置证书 - &gt;本地电脑。我删除了这个,然后一切正常。
答案 3 :(得分:0)
仅分享与Windows 2019服务器和IISExpress以及自签名证书结合的经验。我无法在编辑注册表时使用它,最后我不需要。
以下三个步骤将我带到了那里:
使用Powershell为 localmachine 证书存储生成根证书:
$cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature -Subject "CN=TestRootCert" -KeyExportPolicy Exportable -HashAlgorithm sha256 -KeyLength 2048 -CertStoreLocation "Cert:\LocalMachine\My" -KeyUsageProperty Sign -KeyUsage CertSign
基于具有powershell的根证书,为 localuser 证书存储生成客户端证书:
New-SelfSignedCertificate -Type Custom -Subject "CN=TestChildCert" -Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=test@local") -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My"
将根证书从“个人\证书”移动到“受信任的根证书\证书”
在此之后,我可以选择TestChildCert并接受它。