解决 Windows 登录问题
本文介绍了当用户使用证书和/或智能卡登录时,Windows 提供的日志和错误消息。这些日志提供了可用于排查身份验证失败的信息。
证书和公钥基础设施
-
Windows Active Directory 维护着多个证书存储区,用于管理登录用户的证书。
- NTAuth 证书存储区:要向 Windows 进行身份验证,直接颁发用户证书(即不支持链式)的证书颁发机构必须放置在 NTAuth 存储区中。要查看这些证书,请在 certutil 程序中输入:certutil –viewstore –enterprise NTAuth。
- 根证书和中间证书存储区:通常,证书登录系统只能提供单个证书,因此如果正在使用证书链,则所有计算机上的中间证书存储区都必须包含这些证书。根证书必须位于受信任的根存储区中,倒数第二个证书必须位于 NTAuth 存储区中。
- 登录证书扩展和组策略:Windows 可以配置为强制验证 EKU 和其他证书策略。请参阅 Microsoft 文档:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff404287(v=ws.10)。
| 注册表策略 | 说明 |
|---|---|
| AllowCertificatesWithNoEKU | 禁用时,证书必须包含智能卡登录扩展密钥用法 (EKU)。 |
-
AllowSignatureOnlyKeys 默认情况下,Windows 会筛选出不允许 RSA 解密的证书私钥。此选项会覆盖该筛选。 AllowTimeInvalidCertificates 默认情况下,Windows 会筛选出已过期的证书。此选项会覆盖该筛选。 EnumerateECCCerts 启用椭圆曲线身份验证。 X509HintsNeeded 如果证书不包含唯一的用户主体名称 (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,Active Directory 可以选择在“x509certificate”属性中存储每个用途的精确公共证书。要将此类证书解析为用户,计算机可以直接查询此属性(默认情况下,在单个域中)。
提供了一个选项,允许用户指定一个用户帐户以加快此搜索速度,并且还允许在跨域环境中使用此功能。
如果林中存在多个域,并且用户未明确指定域,则 Active Directory rootDSE 会指定证书映射服务的位置。这通常位于全局编录计算机上,并具有林中所有 x509certificate 属性的缓存视图。此计算机可用于仅基于证书高效地查找任何域中的用户帐户。
控制登录域控制器选择
当环境中包含多个域控制器时,查看和限制用于身份验证的域控制器非常有用,以便可以启用和检索日志。
控制域控制器选择
要强制 Windows 使用特定的 Windows 域控制器进行登录,可以通过配置 lmhosts 文件来显式设置 Windows 计算机使用的域控制器列表:\Windows\System32\drivers\etc\lmhosts。
该位置通常有一个名为“lmhosts.sam”的示例文件。只需包含一行:
1.2.3.4 dcnetbiosname #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 日志
| 消息 | 描述 |
|---|---|
| Build Chain | LSA 调用 CertGetCertificateChain(包括结果) |
| Verify Revocation | LSA 调用 CertVerifyRevocation(包括结果) |
| X509 Objects | 在详细模式下,证书和证书吊销列表 (CRL) 将转储到 AppData\LocalLow\Microsoft\X509Objects |
| Verify Chain Policy | 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 日志
- 域控制器安全日志
- Virtual Delivery Agent (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/en-us/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/en-us/kb/262177
- 使用第三方证书颁发机构启用智能卡登录的准则:https://support.microsoft.com/en-us/kb/281245