HTTP错误 403.16 - 客户端证书信任问题

48

我正在尝试在IIS 8上实现客户端证书认证。我已经将我的配置部署到开发机器上并验证了它的预期工作。但是在设置服务器后,每当我导航到该站点并提示客户端证书时,我选择它并立即获得403.16错误。失败的请求日志给出错误代码2148204809和消息“证书链已处理,但以信任提供程序不信任的根证书终止。”

我有一个有效的客户端证书和有效的CA证书。CA证书已安装在计算机帐户的受信任根机构上,分别安装在服务器和客户端计算机上,并将客户端证书安装在客户端计算机的当前用户帐户的个人区域中。

客户端证书直接由根CA签名,而且如我所说,两者都有效。链中没有其他证书,在受信任的根机构区域中也没有中间证书。

IIS配置具有sslFlags = SslNegotiateCert,并启用iisClientCertificateMappingAuthentication。

服务器未配置为发送CTL,我们的SendTrustedIssuerList = 0。

我看不出为什么不应信任客户端证书。


1
CRL怎么样?它能到达吗? - pepo
我不认为这是个问题……因为证书上没有CDP字段,也没有OCSP URL。我还检查了不受信任的证书存储中的禁用列表,发现两个证书都不在其中。 - Eric
2
我刚在这里回答了这个问题:https://dev59.com/gF4d5IYBdhLWcg3wDu-0#27282889 - Brett
4个回答

147
Windows 2012引入了更严格的证书存储验证。根据KB 2795828: Lync Server 2013 Front-End service cannot start in Windows Server 2012,可信任的根证书颁发机构(即根证书)存储只能包含自签名证书。如果该存储包含非自签名证书,则在IIS下进行客户端证书身份验证时会返回403.16错误代码。
为了解决这个问题,您需要从根存储中删除所有非自签名证书。以下PowerShell命令将识别非自签名证书:
Get-Childitem cert:\LocalMachine\root -Recurse | 
    Where-Object {$_.Issuer -cne $_.Subject}

在我的情况下,我们将这些非自签名证书移入了中间证书颁发机构(即CA)存储区。
Get-Childitem cert:\LocalMachine\root -Recurse | 
    Where-Object {$_.Issuer -cne $_.Subject} | 
    Move-Item -Destination Cert:\LocalMachine\CA

根据KB 2801679: 安装KB 931125后的SSL/TLS通信问题,您可能还有太多的受信任证书。
引用如下: “Schannel安全包支持的受信任证书颁发机构列表的最大大小为16千字节(KB)。拥有大量的第三方根证书颁发机构将超过16k的限制,您将遇到TLS/SSL通信问题。”
在这种情况下的解决方案是删除您不信任的任何证书颁发机构证书,或者通过将“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\@SendTrustedIssuerList”注册表项设置为0(如果不存在,默认值为1)来停止发送受信任证书颁发机构列表。
如果在上述步骤之后问题仍然持续存在,请重新启动计算机。

3
这是我在这个网站上最喜欢的答案。我花了两天时间试图理解客户端证书验证出了什么问题,以及为什么我的受信任证书无效。问题是我在受信任的根机构中有一个非自签名证书。非常感谢你!!! - inser
3
非常感谢第一种情况下提供了一行诊断和一行修复的方式 - 这是一种优雅的方式来提供已经很好的答案。 - Francis Norton
我希望早点看到你的答案!我们在更新一个用于验证请求的证书后,随机开始看到一个 Web 服务返回 403 响应。你上面的第二个 PowerShell 命令解决了这个问题,现在我们恢复正常运行了。 - Brandon Gano
2
还需要注意的是,确保您正在查看LocalMachine帐户,因为certmgr默认情况下会使用当前用户打开(您必须以管理模式在MMC中打开它)。 - theMayer
1
现在是2023年,这个答案帮助我解决了我的问题。 - Rob
显示剩余6条评论

6
在我的情况下,我已经将根证书添加到服务器上的“当前用户”证书存储中,并且遇到了403.16错误。
将我的根证书添加到本地计算机的受信任的根证书颁发机构存储解决了问题。
请按照以下步骤在运行IIS的服务器上进行操作:
对于Windows Server 2008 R2:
  1. 右键单击证书文件,选择“安装证书”。 点击下一步。
  2. 选择“将所有证书放入以下存储”,然后点击“浏览...”
  3. 勾选“显示实体店”
  4. 展开“受信任的根证书颁发机构”,选择“本地计算机”。 点击确定。
  5. 点击下一步/点击完成。
对于Windows Server 2012 R2:
  1. 右键单击证书文件,选择 "安装证书"。
  2. 选择“本地计算机”。 点击下一步。
  3. 选择“将所有证书放入以下存储”,然后点击“浏览...”
  4. 选择“受信任的根证书颁发机构”。 点击确定。
  5. 点击下一步/点击完成。
对于Windows 7:
  1. 开始-> 运行-> mmc.exe
  2. 文件->“添加或删除组件”。 选择“证书”,单击“添加>”并选择“计算机账户”,然后选择“本地计算机”。 点击完成/确定
  3. 展开证书(本地计算机)->受信任的根证书颁发机构->证书。 右键单击证书,然后选择所有任务->导入。
  4. 选择证书文件并点击下一步。
  5. 选择“将所有证书放入以下存储”,然后点击“浏览...”
  6. 勾选“显示实体店”
  7. 展开“受信任的根证书颁发机构”,选择“本地计算机”。 点击确定。
  8. 点击下一步/点击完成。

将我的根证书添加到本地计算机的受信任根机构存储中解决了该问题。我不确定该如何操作。 - Shubh
请参阅 http://superuser.com/questions/647036/view-install-certificates-for-local-machine-store-on-windows-7。 - PST

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 的证书。我移除了它,然后一切正常。


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" 将根证书从Personal\Certificates移动到Trusted Root Certification\Certificates
完成后,我可以选择TestChildCert并且它被成功接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接