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

Posted

技术标签:

【中文标题】HTTP 错误 403.16 - 客户端证书信任问题【英文标题】:HTTP error 403.16 - client certificate trust issue 【发布时间】:2014-12-02 13:21:04 【问题描述】:

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

我有一个有效的客户端证书和一个有效的 CA 证书。 CA 证书安装在服务器和客户端计算机上计算机帐户的 Trusted Root Authorities 中,客户端证书安装在客户端计算机上当前用户帐户的个人区域中。

客户端证书由根 CA 直接签名,正如我所说,两者都是有效的。链中没有其他证书,Trusted Root Authorities 区域中也没有中间证书。

IIS 配置已启用 sslFlags = SslNegotiateCert 和 iisClientCertificateMappingAuthentication。

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

我不明白为什么不应该信任客户端证书。

【问题讨论】:

CRL 怎么样?它可以到达吗? 我不认为这是一个问题...证书上没有 CDP 字段,也没有 OCSP URL。我还检查了不受信任的证书存储中的不允许列表,但那里没有证书。 我刚刚在这里回答了这个问题:***.com/a/27282889/393159 【参考方案1】:

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 -ne $_.Subject

在我的情况下,我们将这些非自签名证书移至中间证书颁发机构(即 CA)存储:

Get-Childitem cert:\LocalMachine\root -Recurse | 
    Where-Object $_.Issuer -ne $_.Subject | 
    Move-Item -Destination Cert:\LocalMachine\CA

根据KB 2801679: SSL/TLS communication problems after you install KB 931125,您可能还有太多受信任的证书。

[T]Schannel 安全包支持的受信任证书颁发机构列表的最大大小为 16 KB。拥有大量第三方根证书颁发机构将超过 16k 限制,您将遇到 TLS/SSL 通信问题。

这种情况下的解决方案是删除任何您不信任的证书颁发机构证书,或 to stop sending the list of trusted certifiation authorities by setting the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\@SendTrustedIssuerList registry entry to 0(如果不存在,默认值为 1)。

【讨论】:

很好的答案!经过数小时的调查,这个答案挽救了我们的生命! 伙计,这是我在这个网站上最喜欢的答案。我花了 2 天时间试图了解客户端证书验证有什么问题以及为什么我的受信任证书无效。问题是我在受信任的根授权中有 1 个非自签名证书。非常感谢!!! 非常感谢为第一个场景提供单线诊断和单线修复 - 提供已经很好的答案的经典方式。 这里是因为 xConnect 和 @nsgocev ;) 同样重要的是要注意,您应该确保您正在查看 LocalMachine 帐户,因为默认情况下 certmgr 会以当前用户打开(您必须在管理模式下使用 MMC 打开它)。 【参考方案2】:

在我的情况下,我一直在将根证书添加到服务器上的“当前用户”证书存储中,并收到 403.16 错误。

将我的根证书添加到本地计算机的受信任的根权限存储解决了该问题。

在运行 IIS 的服务器上执行以下步骤。

对于 Windows Server 2008 R2:

    右键单击证书文件并选择“安装证书”。点击下一步。 选择“将所有证书放入以下存储”并单击“浏览...” 勾选“显示实体店” 展开“受信任的根证书颁发机构”并选择“本地计算机”。点击确定。 单击下一步/单击完成。

对于 Windows Server 2012 R2:

    右键单击证书文件并选择“安装” 证书”。 选择“本地计算机”。点击下一步。 选择“将所有证书放入以下存储”并单击“浏览...” 选择“受信任的根证书颁发机构”。点击确定。 单击下一步/单击完成。

对于 Windows 7:

    开始 -> 运行 -> mmc.exe 文件 -> '添加或删除管理单元'。选择“证书”,单击“添加>”并选择“计算机帐户”,然后选择“本地计算机”。点击完成/确定 扩展证书(本地计算机)-> 受信任的根证书颁发机构-> 证书。右键单击证书并选择所有任务 -> 导入。 选择证书文件,点击下一步。 选择“将所有证书放入以下存储”并单击“浏览...” 勾选“显示实体店” 展开“受信任的根证书颁发机构”并选择“本地计算机”。点击确定。 单击下一步/单击完成。

【讨论】:

Adding my root cert to the Trusted Root Authorities store for the local machine resolved the issue. 我不确定.. 怎么样?? 见superuser.com/questions/647036/…【参考方案3】:

我在 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 的证书放在计算机帐户-> 本地计算机下的受信任的根证书颁发机构中。我删除了它,然后一切正常。

【讨论】:

【参考方案4】:

只是分享我使用 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

    localuser 证书存储区生成一个客户端证书,基于带有 powershell 的根证书: New-SelfSignedCertificate -Type Custom -Subject "CN=TestChildCert" -Signer $cert -TextExtension @("2.5.29.37=text1.3.6.1.5.5.7.3.2","2.5.29.17=textupn=test@local") -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My"

    将根证书从 Personal\Certificates 移动到 Trusted Root Certification\Certificates

在此之后,我可以选择 TestChildCert 并且它被接受了。

【讨论】:

以上是关于HTTP 错误 403.16 - 客户端证书信任问题的主要内容,如果未能解决你的问题,请参考以下文章

使用ssl和客户端证书的Wcf:请求svc succes wcf调用返回403.16

安装SSL证书可以快速提升网站安全与信任度

WCF:无法为 SSL/TLS 安全通道建立信任关系,出现权限错误

信任过期的证书[重复]

https本地自签名证书添加到信任证书访问

Android SSL 错误:证书不受信任...有时