相互证书身份验证失败并出现错误 403.16

Posted

技术标签:

【中文标题】相互证书身份验证失败并出现错误 403.16【英文标题】:Mutual certificates authentication fails with error 403.16 【发布时间】:2015-01-29 16:35:42 【问题描述】:

我使用的是 Windows Server 2012 和 IIS 8.5。我已经为网站设置了 SSL,SSL 设置是:Require Required 和 Require Client Certificates。

我发送到服务器的客户端证书是由一个自签名机构(我们称之为 MyCompany CA)颁发的。 MyCompany CA 证书已成功安装在本地计算机帐户 - 受信任的根证书颁发机构中。它的到期日期是 2039 年,客户端证书的到期日期也是如此。

但是,通过所有这些设置,我得到一个错误 403.16 结果。我启用了失败的请求跟踪规则并设法记录了一个错误的请求并获得了一些关于它的额外详细信息:

52.- MODULE_SET_RESPONSE_ERROR_STATUS - 警告 ModuleName - IIS Web 核心 通知 - BEGIN_REQUEST HttpStatus - 403 HttpReason - 禁止 HttpSubStatus - 16 ErrorCode - 已处理的证书链,但以不受信任提供者信任的根证书终止。 (0x800b0109) 配置异常信息

我检查了多个站点的结果 403.16 和错误代码 0x800b0109,所有站点都指向本地计算机中未安装的证书颁发机构 - 受信任的根证书颁发机构,但这不是我的情况。

谢谢!

【问题讨论】:

【参考方案1】:

我研究了很久,终于找到了!

向 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 添加新密钥 值名称:ClientAuthTrustMode 值类型:REG_DWORD 数值数据:2

刷新网页,选择证书,见证奇迹发生。

研究

使用 Windows 8 和 IIS 8.5,我按照此处的说明进行操作 http://itq.nl/testing-with-client-certificate-authentication-in-a-development-environment-on-iis-8-5/。

在正确的位置创建了证书,并且在 IIS 中正确配置了所有内容,但我不断收到 403.16 错误。

在许多 MSDN 文章和其他尝试失败后,我找到了以下注册表设置。

设置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 值名称:ClientAuthTrustMode 值类型:REG_DWORD 数值数据:2

设置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 值名称:SendTrustedIssuerList 值类型:REG_DWORD 数值数据:0(假,或完全删除此键)

以下是有关此特定设置的更多信息(可在此处找到:http://technet.microsoft.com/en-us/library/hh831771.aspx)

信任模式的默认值 Schannel 提供程序支持三种客户端身份验证信任模式。信任模式控制如何执行客户端证书链的验证,它是一个系统范围的设置,由 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel 下的 REG_DWORD “ClientAuthTrustMode”控制。

0 机器信任(默认) 要求客户端证书由受信任的颁发者列表中的证书颁发。

1 独占根信任 要求客户端证书链接到调用者指定的受信任颁发者存储中包含的根证书。证书还必须由受信任的颁发者列表中的颁发者颁发

2 独家 CA 信托 要求客户端证书链到调用者指定的受信任颁发者存储中的中间 CA 证书或根证书。 有关受信任的颁发者配置问题导致的身份验证失败的信息,请参阅知识库文章 280256。

希望这对你也有用。

【讨论】:

在客户端身份验证颁发者存储中添加证书后,我不得不重新启动。 YMMV。 除了这个答案解决了我在 2012 年的问题之外,我发现我还需要在我的 Windows Server 2008 R2 / IIS 7.5 上执行此操作。根据您对问题的描述以及在那个盒子上我得到的是 403.7 而不是 403.16 的事实,我认为这不会有所作为,但确实如此。谢谢! ClientAuthTrustMode 值类型:REG_DWORD 值数据:2 - 不适用于我的 Windows 2012 R2。仍然出现 403.16 错误 几年后终于解决了,tnx for this magic,Brett! ))【参考方案2】:

我已经尝试了上面建议的解决方案,并且效果很好。

不涉及编辑注册表的替代解决方案:

https://support.microsoft.com/en-us/help/2795828/lync-server-2013-front-end-service-cannot-start-in-windows-server-2012

本文的重点是从本地计算机受信任的根文件夹中删除所有未签名的证书。

如果您使用组策略部署证书,请确保受信任的根证书颁发机构存储仅包含自签名证书(证书属性“主题”与证书属性“颁发者”相同的证书)。将任何不是自签名证书的证书从受信任的根证书颁发机构存储移动到中间证书颁发机构存储。

如果您手动导入新证书,请确保选择 计算机的受信任的根证书颁发机构存储 自签名证书和计算机的中间 证书颁发机构存储的证书不是 自签名证书。

您可以使用 Powershell 脚本找到所有非自签名证书:

Get-Childitem cert:\LocalMachine\root -Recurse | Where-Object $_.Issuer -ne $_.Subject | Format-List * | Out-File "c:\computer_filtered.txt"

将这些证书移动到 mmc 中的 Intermediate Certification Authorities 文件夹。

【讨论】:

***.com/a/35001970/237568 上类似行的好答案还包括一个 PowerShell 单线,用于将非自签名证书移动到中间证书颁发机构文件夹:)【参考方案3】:

我必须重新启动服务器才能应用 ClientAuthTrustMode 设置。

【讨论】:

以上是关于相互证书身份验证失败并出现错误 403.16的主要内容,如果未能解决你的问题,请参考以下文章

JBoss 相互证书身份验证在 SSL 握手时失败

Packer 自定义映像构建失败并出现 ssh 身份验证错误

CAS HTTP 401 - 身份验证失败:凭据错误

Curl 中出现错误 - 对等证书无法使用已知 CA 证书进行身份验证

ADLDS SSL 证书问题身份验证失败

使用 Spring Boot/Spring Security 对 LDAP 进行证书身份验证