解决 Windows 登录问题
本文介绍当用户使用证书和/或智能卡登录时,Windows 提供的日志和错误消息。这些日志提供可用于排查身份验证失败的信息。
证书和公钥基础结构
Windows Active Directory 维护多个证书存储,用于管理登录用户的证书。
-
NTAuth 证书存储:要向 Windows 进行身份验证,立即颁发用户证书的证书颁发机构(即不支持链式颁发)必须放置在 NTAuth 存储中。要查看这些证书,请在 certutil 程序中输入:certutil –viewstore –enterprise NTAuth。
-
根证书和中间证书存储:通常,证书登录系统只能提供单个证书,因此如果使用证书链,则所有计算机上的中间证书存储必须包含这些证书。根证书必须位于受信任的根存储中,倒数第二个证书必须位于 NTAuth 存储中。
-
登录证书扩展和组策略:Windows 可以配置为强制验证 EKU 和其他证书策略。请参阅 Microsoft 文档:
<https://docs.microsoft.com/zh-cn/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff404287(v=ws.10)>。
| 注册表策略 | 描述 |
|---|---|
| AllowCertificatesWithNoEKU | 禁用时,证书必须包含智能卡登录扩展密钥用法 (EKU)。 |
| AllowSignatureOnlyKeys | 默认情况下,Windows 会筛选出不允许 RSA 解密的证书私钥。此选项会覆盖该筛选器。 |
| AllowTimeInvalidCertificates | 默认情况下,Windows 会筛选出过期的证书。此选项会覆盖该筛选器。 |
| EnumerateECCCerts | 启用椭圆曲线身份验证。 |
| X509提示需要 | 如果证书不包含唯一的“用户主体名称 (UPN)”,或者可能存在歧义,此选项允许用户手动指定其 Windows 登录帐户。 |
| UseCachedCRLOnlyAnd, IgnoreRevocationUnknownErrors | 禁用吊销检查(通常在域控制器上设置)。 |
-
域控制器证书:为了对 Kerberos 连接进行身份验证,所有服务器都必须具有相应的“域控制器”证书。可以使用“本地计算机证书个人存储”MMC 管理单元菜单请求这些证书。
UPN 名称和证书映射
建议用户证书在主题备用名称扩展中包含唯一的“用户主体名称 (UPN)”。
Active Directory 中的 UPN 名称
默认情况下,Active Directory 中的每个用户都有一个隐式 UPN,其模式为 \<samUsername>@\<domainNetBios> 和 \<samUsername>@\<domainFQDN>。可用域和 FQDN 包含在林的 RootDSE 条目中。请注意,单个域可以在 RootDSE 中注册多个 FQDN 地址。
此外,Active Directory 中的每个用户都有一个显式 UPN 和 altUserPrincipalNames。这些是指定用户 UPN 的 LDAP 条目。
通过 UPN 搜索用户时,Windows 首先在当前域(基于查找 UPN 的进程的身份)中查找显式 UPN,然后查找备用 UPN。如果没有匹配项,它会查找隐式 UPN,该 UPN 可能会解析为林中的不同域。
证书映射服务
如果证书不包含显式 UPN,Active Directory 可以选择在“x509certificate”属性中为每个用途存储一个精确的公共证书。要将此类证书解析为用户,计算机可以直接查询此属性(默认情况下,在单个域中)。
系统提供了一个选项,供用户指定一个用户帐户,以加快此搜索速度,并允许在跨域环境中使用此功能。
如果林中存在多个域,并且用户未明确指定域,则 Active Directory rootDSE 会指定证书映射服务的位置。此服务通常位于全局编录计算机上,并具有林中所有 x509certificate 属性的缓存视图。此计算机可用于仅基于证书高效地查找任何域中的用户帐户。
控制登录域控制器选择
当环境包含多个域控制器时,查看并限制用于身份验证的域控制器非常有用,这样可以启用和检索日志。
控制域控制器选择
要强制 Windows 使用特定的 Windows 域控制器进行登录,可以通过配置 lmhosts 文件(\Windows\System32\drivers\etc\lmhosts)来显式设置 Windows 计算机使用的域控制器列表。
该位置通常有一个名为“lmhosts.sam”的示例文件。只需包含一行:
1.2.3.4 域控制器NetBIOS名称 #PRE #DOM:mydomai
其中“1.2.3.4”是“mydomain”域中名为“dcnetbiosname”的域控制器的 IP 地址。
重新启动后,Windows 计算机将使用该信息登录到 mydomain。请注意,调试完成后必须还原此配置。
识别正在使用的域控制器
登录时,Windows 会使用登录用户的域控制器设置一个 MSDOS 环境变量。要查看此信息,请使用命令:echo %LOGONSERVER% 启动命令提示符。
与身份验证相关的日志存储在此命令返回的计算机上。
启用帐户审核事件
默认情况下,Windows 域控制器不启用完整的帐户审核日志。这可以通过组策略编辑器中安全设置中的审核策略进行控制。启用后,域控制器会在安全日志文件中生成额外的事件日志信息。
证书验证日志
检查证书有效性
如果智能卡证书导出为 DER 证书(无需私钥),您可以使用以下命令对其进行验证:certutil –verify user.cer
启用 CAPI 日志记录
在域控制器和用户计算机上,打开事件查看器并为 Microsoft/Windows/CAPI2/Operational Logs 启用日志记录。
您可以通过以下注册表项控制 CAPI 日志记录:CurrentControlSet\Services\crypt32。
| 值 | 描述 |
|---|---|
| DiagLevel (DWORD) | 详细级别 (0 到 5) |
| DiagMatchAnyMask (QUADWORD) | 事件筛选器(全部使用 0xffffff) |
| DiagProcessName (MULTI_SZ) | 按进程名称筛选(例如,LSASS.exe) |
CAPI 日志
| 消息 | 描述 |
|---|---|
| 构建链 | LSA 调用 CertGetCertificateChain(包括结果) |
| 验证吊销 | LSA 调用 CertVerifyRevocation(包括结果) |
| X509 对象 | 在详细模式下,证书和证书吊销列表 (CRL) 将转储到 AppData\LocalLow\Microsoft\X509Objects |
| 验证链策略 | LSA 调用 CertVerifyChainPolicy(包括参数) |
错误消息
| 错误代码 | 描述 |
|---|---|
| 证书不受信任 | 智能卡证书无法使用计算机的中间证书和受信任的根证书存储中的证书构建。 |
| 证书吊销检查错误 | 无法从证书 CRL 分发点指定的地址下载智能卡的 CRL。如果强制执行吊销检查,这将阻止登录成功。请参阅 证书和公钥基础结构 部分。 |
| 证书使用错误 | 该证书不适用于登录。例如,它可能是服务器证书或签名证书。 |
Kerberos 日志
要启用 Kerberos 日志记录,请在域控制器和最终用户计算机上创建以下注册表值:
| 配置单元 | 值名称 | 值 [DWORD] |
|---|---|---|
| CurrentControlSet\Control\Lsa\Kerberos\Parameters | LogLevel | 0x1 |
| CurrentControlSet\Control\Lsa\Kerberos\Parameters | KerbDebuglevel | 0xffffffff |
| CurrentControlSet\Services\Kdc | KdcDebugLevel | 0x1 |
| CurrentControlSet\Services\Kdc | KdcExtraLogLevel | 0x1f |
Kerberos 日志记录输出到系统事件日志。
-
诸如“不受信任的证书”之类的消息应该很容易诊断。
-
两个错误代码是信息性的,可以安全地忽略:
-
KDC_ERR_PREAUTH_REQUIRED(用于与旧域控制器向后兼容)
-
未知错误 0x4b
-
事件日志消息
本节介绍当用户使用证书登录时,域控制器和工作站上预期的日志条目。
-
域控制器 CAPI2 日志
-
域控制器安全日志
-
虚拟投递代理 (VDA) 安全日志
-
VDA CAPI 日志
-
VDA 系统日志
域控制器 CAPI2 日志
在登录期间,域控制器会验证调用者的证书,并生成以下形式的日志条目序列。
最终的事件日志消息显示,域控制器上的 lsass.exe 根据 VDA 提供的证书构建了一个链,并验证其有效性(包括吊销)。结果返回为“ERROR_SUCCESS”。
域控制器安全日志
域控制器显示一系列登录事件,关键事件是 4768,其中证书用于颁发 Kerberos 票证授予票证 (krbtgt)。
此之前的消息显示服务器的计算机帐户正在向域控制器进行身份验证。此之后的消息显示属于新 krbtgt 的用户帐户正在用于向域控制器进行身份验证。
VDA 安全日志
与登录事件对应的 VDA 安全审核日志是事件 ID 为 4648 的条目,源自 winlogon.exe。
VDA CAPI 日志
此示例 VDA CAPI 日志显示来自 lsass.exe 的单个链构建和验证序列,用于验证域控制器证书 (dc.citrixtest.net)。
VDA 系统日志
启用 Kerberos 日志记录后,系统日志会显示错误 KDC_ERR_PREAUTH_REQUIRED(可以忽略),以及来自 Winlogon 的条目,显示 Kerberos 登录成功。
最终用户错误消息
本节列出了在 Windows 登录页面上向用户显示的常见错误消息。
| 显示的错误消息 | 说明和参考 |
|---|---|
| 无效的用户名或密码 | 计算机认为您拥有有效的证书和私钥,但 Kerberos 域控制器拒绝了连接。请参阅本文的“Kerberos 日志”部分。 |
| 系统无法登录您。无法验证您的凭据。/ 不支持该请求 | 域控制器无法联系,或者域控制器尚未配置支持智能卡身份验证的证书。为域控制器注册“Kerberos 身份验证”、“域控制器身份验证”或“域控制器”证书。即使现有证书看起来有效,通常也值得尝试。 |
| 系统无法将您登录。用于身份验证的智能卡证书不受信任。 | 中间证书和根证书未安装在本地计算机上。请参阅证书和公钥基础结构。 |
| 错误请求 | 这通常表示证书上的扩展未正确设置,或者 RSA 密钥太短(<2048 位)。 |
相关信息
-
配置域以进行智能卡登录:
<http://support.citrix.com/article/CTX206156> -
智能卡登录策略:
<https://docs.microsoft.com/zh-cn/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff404287(v=ws.10)> -
启用 CAPI 日志记录:
<http://social.technet.microsoft.com/wiki/contents/articles/242.troubleshooting-pki-problems-on-windows.aspx> -
启用 Kerberos 日志记录:
<https://support.microsoft.com/zh-cn/kb/262177> -
使用第三方证书颁发机构启用智能卡登录的准则:
<https://support.microsoft.com/zh-cn/kb/281245>