我遇到了一个奇怪的情况。我的 Win 2016 服务器被 AD 组策略破坏了。
目前,IIS 10 在自动 AD 组策略更新后开始抛出 403 错误。之前,远程方通过客户端证书通过 https 毫无问题地呼叫我们。
我有 X 时刻之前和 X 时刻之后的备份,但我无法精确定位被 AD GP 更改的设置。
我有一份设置文件,其中包含从头开始设置我们的 Web 服务所需的所有设置。我已经针对受害服务器检查了所有设置。没有任何变化。在每个级别都启用了匿名身份验证,并且 SSL 设置->客户端证书->接受。
我们的管理员发誓他们没有做任何改变。IIS 日志在 X 时刻之后没有任何显示。
知道该看哪里吗?注册表?元数据库?
根据 SOAP e2e 跟踪日志返回给调用者的确切错误:
The HTTP request was forbidden with client authentication scheme 'Anonymous'.[The remote server returned an error: (403) Forbidden.]
答案1
组策略和 IIS 服务器的一个常见问题是,当 GPO 覆盖本地安全策略分配的用户权限时,IIS 服务帐户无法登录。如果发生这种情况,Windows 安全日志应该有 IIS 服务器服务帐户的 EventId 4625 登录失败事件。
您可以通过从 IIS 服务器运行 RSOP.MSC 并导航到计算机配置 > 策略 > Windows 设置 > 安全设置 > 本地策略 > 用户权限分配来快速验证任何 GPO 干扰
查看源 GPO 列以确定哪个 GPO 正在应用设置。使用 gpedit.msc 查看/编辑本地组策略应用的设置。
您可以使用本文验证您的 IIS 服务器权限。从页面底部的“本地安全策略分配的 Windows 用户权限”表开始。
请记住:只要以受控的方式进行测试和应用,GPO 就不是敌人。
答案2
简短回答
检查恶意证书。就我而言,受信任的根证书颁发机构证书存储中有一个非自签名证书。我们的管理员已将此政府颁发的证书添加到整个林中(通过组策略),而事先没有进行适当的测试。
细节
我在这里列出了一些通用的故障排除指南,以帮助人们像我的情况一样,在 3 周内更快地解决此类问题。
AD 组策略
如果您不熟悉组策略,请使用以下命令获取可读的报告(最好通过 IE 查看):
GPRESULT /H C:\GPReport.html
要查看更多详细信息RSOP.MSC
请使用@twconnell推荐。RSOP.MSC 显示已应用的本地和组策略的有效快照。在 验证安全性Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment
。就我而言,我已经仔细阅读了这篇出色的所以回答并点击了那里的每个链接。然后我检查了每个文件、文件夹和应用程序池的访问权限。那里没有任何问题。
IIS 日志
查看 IIS 日志。除了403
向客户端提供的代码之外,还应该包含更多详细信息。就我的情况而言,那里有403 16
代码。
看这个故障排除指南对我来说,它就是这么短:Client certificate is untrusted or invalid
证书吊销列表 (CRL)
我的证书 CA 是 AD 提供的公司 CA,所以我最初认为证书吊销列表 (CRL) 可能存在一些问题。最佳实用指南是这个. 如需了解更多详情,请阅读这,这最后这个怪物。就我而言,CRL 没有问题,因为我遵循了这,这和这提前指导。结果:
netsh http 显示 sslcert ipport=0.0.0.0:443 ... 验证客户端证书吊销:已禁用 仅使用缓存的客户端证书验证吊销:已禁用 使用情况检查:已禁用 撤销新鲜时间 : 0 URL 检索超时:0 Ctl 标识符:(空) Ctl 商店名称:(空) DS Mapper 使用:已禁用 协商客户端证书:已启用 ...
SSL 调试
要从客户端调试 SSL,请使用openssl
工具(假设我的服务器使用通用的 443 端口进行 https ):
openssl s_client -connect myserver:443
在我的例子中,acceptable CAs for client certificates
它最初是空的,因此我将 DWORD 值设置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\SendTrustedIssuerList
为 1,然后重新启动服务器按照本指南(靠近底部)。请注意,由于 CA 列表过长,IIS 中可接受的客户端证书 CA 列表为空的问题也可能出现。这个科幻问题。
acceptable CAs for client certificates
当您在输出中看到 列表时,openssl
您可以将其与服务器上配置的证书存储的内容进行比较。在我的情况下,只有一个属于 的证书Trusted Root Certification Authorities
。所以经过几天的调查,我发现了这一点ms-support 文章 #2802568。实际上,一个放置不当的非自签名证书会导致整个身份验证链失败。
结语
引用@tylerl
SSL 客户端身份验证很乱。它很好,因为它绝对安全,但它很糟糕,因为它很难设置和维护。除非您有充分的理由,否则请改用共享密钥身份验证(即“密码”)。这样可以节省时间和金钱。当安全性远远超过成本时,SSL 身份验证是不错的选择。