相互证书认证失败,错误代码为403.16。

19
我正在使用Windows Server 2012和IIS 8.5。我为网站设置了SSL,SSL设置为:需要、必须且需要客户端证书。
我发送到服务器的客户端证书是由自签名机构(称之为MyCompany CA)发行的。MyCompany CA证书已成功安装在本地计算机帐户-受信任的根证书颁发机构中。它的过期日期为2039年,客户端证书的过期日期也是2039年。
然而,尽管做了这一切设置,我还是得到了403.16错误。我启用了失败请求跟踪规则,并设法记录了一个错误请求并获取了一些额外的细节:
52.- MODULE_SET_RESPONSE_ERROR_STATUS - 警告 模块名称 - IIS Web Core 通知 - BEGIN_REQUEST HTTP状态码 - 403 HttpReason - Forbidden HttpSubStatus - 16 ErrorCode - 证书链处理完毕,但是结束于不被信任的根证书。 (0x800b0109) 配置异常信息
我查看了多个关于结果403.16和错误代码0x800b0109的网站,所有这些网站都指向认证机构未安装在本地计算机-受信任的根证书颁发机构中,但这不是我的情况。
谢谢!
4个回答

56

我已经长时间在此工作,终于找到了!

向 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 机器信任(默认) 需要客户端证书由 Trusted Issuers 列表中的证书颁发。

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

2 专属CA信任 要求客户端证书链到调用方指定的可信发行者存储中的中间CA证书或根证书。

有关因受信任发行者配置问题导致的身份验证失败的信息,请参见知识库文章280256。

希望这对您也有帮助。


3
在将证书添加到客户端认证颁发者存储后,我必须重新启动。可能因人而异。 - Timores
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rusty
1
客户端身份验证信任模式 值类型: REG_DWORD 值数据: 2 - 对我来说在Windows 2012 R2上无效。仍然出现403.16错误。 - mit
终于在几年后解决了,感谢这个神奇的 Brett!)) - menkow

6

我已经尝试了上面提出的解决方案,它可以正常工作。

另一种不需要编辑注册表的解决方案:

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文件夹中。


类似的好答案在 https://dev59.com/uF8d5IYBdhLWcg3w8WFt#35001970 上,还包括一个 PowerShell 一行命令将非自签名证书移动到中间认证机构文件夹 :) - Francis Norton

2

我不得不重新启动服务器才能使ClientAuthTrustMode设置生效。


1

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