有许多计算机的用户证书突然停止工作。
运行certutil -silent -user -store my
表明受影响用户的所有用户证书已停止工作。
my
================ Certificate 0 ================
Serial Number: 2a0000210be8f0775a3a2e2b7200040000210b
Issuer: CN=PROD Issuing CA, DC=somecompany, DC=Com, DC=Au
NotBefore: 10/01/2017 7:46 AM
NotAfter: 10/01/2018 7:46 AM
Subject: CN=username, OU=somecompany, OU=Level 1, OU=Laptop Users, OU=Special Group Users, DC=somecompany, DC=Com, DC=Au
Non-root Certificate
Template: 1.3.6.1.4.1.311.21.8.4586432.4805332.10505398.7351119.9274134.0.14270575.7769536
Cert Hash(sha1): cc 3b d0 2c 03 a1 d9 d4 0d 28 31 a7 84 c8 6d cb 6d 97 27 d8
Key Container = 48fa6c038e897eb98ea252b465308c55_7cc43284-5d87-4ba0-8673-6fb4d4de8f2d
Provider = Microsoft Enhanced Cryptographic Provider v1.0
Cannot find the certificate and private key for decryption.
================ Certificate 1 ================
Serial Number: 7b4d6131959b5f6cd272
Issuer: CN=Communications Server
NotBefore: 25/08/2017 10:41 AM
NotAfter: 25/08/2017 6:41 PM
Subject: [email protected]
Non-root Certificate
Template:
Cert Hash(sha1): 80 25 75 64 60 77 21 16 35 18 ee 04 4f 87 bc 5f f0 ae b3 2a
Key Container = [email protected]
Provider = Microsoft Enhanced Cryptographic Provider v1.0
Cannot find the certificate and private key for decryption.
检查%APPDATA%\Microsoft\Crypto\RSA
文件夹可以看到私钥文件存在,即在本例中是第一个证书48fa6c038e897eb98ea252b465308c55_7cc43284-5d87-4ba0-8673-6fb4d4de8f2d
。
导致此问题的潜在原因是什么?我怀疑私钥的加密密钥已被删除/修改;但不知道该如何确认是否正在更改。
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\CC3BD02C03A1D9D40D2831A784C86DCB6D9727D8
在这种情况下,我们使用证书哈希(sha1)来查找存在的用户证书。
%APPDATA%\Microsoft\Crypto\RSA\S-1-5-21-2091123715-180627453-533688462-45495\48fa6c038e897eb98ea252b465308c55_7cc43284-5d87-4ba0-8673-6fb4d4de8f2d
然后使用密钥容器字段,我们找到其中存在的私钥。
文件被修改了:
• SystemCertificates 文件 CC3BD02C03A1D9D40D2831A784C86DCB6D9727D8 最后修改时间为 2017 年 8 月 25 日上午 10:55。此时是否请求了新密钥,即在此之前是否有用户报告过问题?
• 下面的私钥文件%APPDATA%\Microsoft\Crypto\RSA\S-1-5-21-2091123715-180627453-533688462-45495\48fa6c038e897eb98ea252b465308c55_7cc43284-5d87-4ba0-8673-6fb4d4de8f2d
最后修改时间为 2017 年 10 月 1 日上午 7:56(接近系统证书文件上发布的时间)
• 私钥已使用主密钥加密,%APPDATA%\Microsoft\Protect\<user SID>\c77f3872-e1e2-4449-9729-cc97e85e4a3c
上次修改时间为 2017 年 7 月 25 日上午 8:19
• Protect 文件夹包含用于解密私钥的主密钥,文件最后修改时间为 2017 年 8 月 14 日上午 8:23
• %APPDATA%\Microsoft\SystemCertificates\My\Certificates
2017 年 12 月 7 日凌晨 12:00 至早上 7:50 以不同时间间隔修改了 0 字节证书文件,2017 年 8 月 6 日晚上 11:52 至 2017 年 9 月 6 日上午 8:33 每隔 8 分钟修改一次
目前我们正在使用 Windows 审核来查找对%APPDATA%\Microsoft\SystemCertificates
文件夹的修改%APPDATA%\Microsoft\Crypto
以及%APPDATA%\Microsoft\Protect
然而,鉴于证书和私钥文件似乎存在,不确定这是否能找出原因。
应用程序日志还包含针对 CertificationServicesClient-AutoEnrollment 源的错误:
域\用户名的自动证书注册失败(0x8007003a)指定的服务器无法执行请求的操作。
有任何推荐的步骤可以进一步确定“无法找到用于解密的证书和私钥”错误的根本原因吗?
答案1
该问题似乎是由远程密码重置引起的。在测试环境中复制了该问题:
• 具有配置了自动注册的证书颁发机构的 Server 2012 R2 域控制器
• Windows 7 x64 客户端已加入域
• 仅托管 DC 和客户端的隔离网络
• 具有可导出私钥的用户证书模板
- 通过自动注册组策略将用户证书部署到客户端
- 从网络中删除客户端
- 已确认用户可以导出证书私钥,允许在 Windows 7 客户端上使用 certmgr 导出
- 客户端重新连接至网络
- 从域控制器重置登录客户端的用户密码
- 使用“以身份运行”在客户端上缓存更新后的密码
- 客户端与网络断开连接
- 注销/登录时断开网络连接并使用更新的缓存凭据
- 无法导出私钥
- 客户端重新连接至网络
- 无法导出私钥
- 注销/登录连接到网络 - 现在可以再次导出私钥
私钥通过使用存储在 %APPDATA%\Microsoft\Protect\\ 中的主密钥进行加密保护,主密钥通过包括用户密码在内的多项组合进一步加密。如果主密钥无法解密,则私钥无法使用。
密码更改方法 - 客户端上按 Ctrl+Alt+Del“更改密码”
使用进程监视器识别的本地安全机构进程(LSASS.exe)执行以下操作:
- 通过端口 TCP 端口 88(kerberos)和 TCP 端口 464(kpasswd / kerberos v5)与域控制器通信
- 更新 HKLM\Security\Cache 下的注册表项
- 写入 \domaincontroller\PIPE\protected_storage
- 用户配置文件服务更新 HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\\RefCount
- 更新主密钥,用于解密私钥:
%APPDATA%\Microsoft\Protect\\
- 读取 %APPDATA%\Microsoft\Protect 下的 SYNCHIST 和 CREDHIST 文件
- 更新 %APPDATA%\Microsoft\Protect\SYNCHIST 文件
- 过程1-7可能重复多次
- 更新 C:\Windows\debug\PASSWD.log,并显示“正在尝试更改用户的服务器/域密码
私钥由于步骤 5 - 7 而继续起作用。
密码更改方法 - 通过 Active Directory 用户和计算机进行远程重置
- SYNCHIST 和主密钥文件不会立即自动更新
- 注销/登录网络更新 SYNCHIST 和主密钥文件,证书正常