本文提供了证书服务(CS)可能无法在运行 Windows Server 的计算机上启动的问题的解决方案。
原始 KB 编号: 842210
现象
在运行 Windows Server 的计算机上,证书服务可能无法启动。
此外,可能会在应用程序日志事件查看器中记录以下错误消息。
Active Directory 证书服务未启动:无法加载或验证当前的 CA 证书。 Contoso CA 密钥集不存在0x80090016(-2146893802 NTE_BAD_KEYSET)。
原因
在证书服务启动之前,它枚举已颁发给证书颁发机构(CA)的所有密钥和证书,即使密钥和证书已过期。 如果其中任何一个证书已从本地计算机个人证书存储中删除,则证书服务不会启动。
解决方法
若要解决此问题,请验证注册表中的证书指纹数是否等于已颁发给 CA 的证书数。 如果缺少任何证书,请将缺少的证书导入到本地计算机个人证书存储中。 导入缺少的证书后,使用 certutil -repairstore 命令修复导入的证书与关联的私钥存储之间的链接。
若要解决此问题,请执行这些步骤。
步骤 1:查找缺少的证书
重要
此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,按以下步骤操作时请务必谨慎。 作为额外保护措施,请在修改注册表之前先将其备份。 如果之后出现问题,您就可以还原注册表。 有关详细信息,请参阅 如何在 Windows 中备份和还原注册表。
证书指纹指示已颁发给此 CA 的所有证书。 每次续订证书时,都会将新的证书指纹添加到注册表中的 CaCertHash 列表中。 此列表中的条目数必须与颁发给 CA 的证书数相等,并且这些证书列在本地计算机个人证书存储中。
若要查找缺少的证书,请执行以下步骤:
-
选择“开始”,键入 regedit,然后按 Enter。
-
找到并选择以下子项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<Your_Certificate_Authority_Name> -
在右窗格中,双击 CaCertHash。
-
记下值数据列表包含的证书指纹数。
-
启动命令提示符。
-
键入以下命令,然后按 Enter:
certutil -store将本地计算机个人证书存储中列出的证书数与 CaCertHash 注册表项中列出的证书指纹数进行比较。 如果数字不同,请转到 步骤 2:导入缺少的证书。 如果数字相同,请转到 步骤 3:修复链接。
步骤 2:导入缺少的证书
- 选择“开始”,键入 mmc,然后按 Enter。
- 在“文件”菜单中,选择“添加/删除管理单元”。
- 在管理单元列表中,选择“证书**”**,然后选择“添加”。
- **出现“证书”**管理单元对话框时,选择“计算机帐户”,然后选择“下一步>完成”。
- 选择“确定”。 证书目录现已添加到Microsoft管理控制台(MMC)。
- 展开**“证书个人”,右键单击“证书>”,指向“所有任务**”,然后选择“导入”。
- 在“欢迎”页上,选择“下一步”。
- 在**“要导入的文件”页上,在“文件名”框中键入要导入的证书文件的完整路径,然后选择“下一步”。 而是选择“浏览”**,搜索文件,然后选择“下一步”。
- 如果要导入的文件是个人信息 Exchange-PKCS #12 (*)。PFX) 文件,系统会提示输入密码。 键入密码,选择 将此密钥标记为可 导出的导入选项,然后选择“ 下一步”。
- 在 “证书存储 ”页上,选择“ 下一步”。
- 在 “完成证书导入向导 ”页上,选择“ 完成”。
注意
默认情况下,CA 将其 CA 证书发布到 %systemroot%\System32\CertSvc\CertEnroll 文件夹。 你可能会在该文件夹中找到缺少的证书。
步骤 3:修复链接
若要修复链接,请执行以下步骤:
-
打开命令提示符。
-
键入以下命令,然后按 Enter:
cd %systemroot%\system32\certsrv\certenroll -
记下 certenroll* 文件夹中类似于以下内容的*证书:
<Your_Server>. <Your_Domain>.com_rootca.crt -
键入以下命令,然后在每个命令后按 Enter :
certutil -addstore my %systemroot%\system32\certsrv\certenroll\Your_Server.Your_Domain.com_rootca.crtcertutil -dump %systemroot%\system32\certsrv\certenroll\Your_Server.Your_Domain.com_rootca.crt<Your_Server>.<Your_Domain>.com_rootca.crt是步骤 3 中记录的 certenroll* 文件夹中的证书*的名称。 -
在最后一个命令的输出中,在末尾附近,你将看到如下所示的行:
Key Id Hash(sha1): ea c7 7d 7e e8 cd 84 9b e8 aa 71 6d f4 b7 e5 09 d9 b6 32 1b数据
Key Id Hash特定于计算机。 记下此行。 -
键入以下命令,包括引号,然后按 Enter:
%systemroot%\system32\certutil -repairstore my "<Key_Id_Hash_Data>"在此命令中,
Key_Id_Hash_Data是你在步骤 5 中记录的行。 例如,请键入以下内容:certutil -repairstore my "ea c7 7d 7e e8 cd 84 9b e8 aa 71 6d f4 b7 e5 09 d9 b6 32 1b"然后,你将收到以下输出:
CertUtil: -repairstore command completed successfully. -
若要验证证书,请键入以下命令,然后按 Enter:
certutil -verifykeys此命令运行后,你将收到以下输出:
CertUtil: -verifykeys command completed successfully.
步骤 4:启动证书服务服务
- 选择开始,指向管理工具,然后选择服务。
- 右键单击 “证书服务”,然后选择“ 启动”。
详细信息
如果满足以下条件之一,则必须解除授权并替换 CA:
- 找不到缺少的证书。
- 无法重新安装证书。
certutil -repairstore命令无法完成,因为私钥已被删除。
注意
如果此问题发生在公钥基础结构 (PKI) 层次结构的根 CA 上,如果无法修复该问题,则必须替换整个 PKI 层次结构。 有关如何删除 PKI 层次结构的详细信息,请参阅 如何解除 Windows 企业证书颁发机构的授权并删除所有相关对象。