相互证书身份验证失败,错误403.16

时间:2014-12-01 16:05:57

标签: ssl iis http-status-code-403 client-certificates

我使用的是Windows Server 2012和IIS 8.5。我为网站设置了SSL,SSL设置为:需要并且需要客户端证书。

我发送给服务器的客户端证书是由自签名机构颁发的(我们称之为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) ConfigExceptionInfo

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

谢谢!

3 个答案:

答案 0 :(得分:46)

我已经做了很长时间了,终于找到了!

将新密钥添加到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(False,或完全删除此键)

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

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

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

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

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

希望这也适合你。

答案 1 :(得分:3)

我已尝试过上面提出的解决方案,但效果很好。

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

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

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

  

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

     

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

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

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

将这些证书移至mmc中的中级证书颁发机构文件夹。

答案 2 :(得分:1)

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