本文有助于解决使用密钥存储提供程序(KSP)提供程序时,使用现有公钥和私钥对续订证书时证书续订失败的问题。
在证书颁发机构管理单元中,右键单击 CA 并选择“所有任务>续订 CA 证书”。 然后,在 “续订 CA 证书 ”对话框中,当系统要求生成新的公钥和私钥对时,选择“ 否”,这意味着重复使用现有的密钥对。 在这种情况下,系统不会提示保存请求或按预期将请求发送到脱机 CA。 CA 服务会自动重启,续订失败。
KeySpec 值为 2
对于使用 KSP 提供程序的 CA 证书,密钥规范 (KeySpec) 属性应具有值KeySpec``0。 但是,当出现问题时, KeySpec 值为 2导致 CA 证书续订失败。
将 KeySpec 值从 2 更新为 0
若要解决此问题,请使用以下步骤从2中0更新KeySpec值:
-
使用以下命令导出本地计算机存储:
certutil -v -store my > c:\temp\machine.txt -
检查
KeySpec续订期间 CA 使用的所有证书的值。 例如:================ Certificate 3 ================ X509 Certificate: Version: 3 Serial Number: 21000000044a30cdeaaaae7b08000000000004 Signature Algorithm: Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA Algorithm Parameters: 05 00 Issuer: CN=ROOTCA-CA Name Hash(sha1): a07626ccaaaaabbbb562364300973304401cd3fb Name Hash(md5): 78ac82e59faaaabbbbe860f908f29b29 NotBefore: <DateTime> NotAfter: <DateTime> Subject: CN=Contoso CA DC=Contoso DC=com ... Name Hash(sha1): 01aad90aaaabbbbf368a509eed47be8ea0a3b78d Name Hash(md5): 278a394aaaabbbbf27fbd177c498ca02 Cert Hash(md5): 1b425aaaabbbbaf29c6747e9e0b6f093 Cert Hash(sha1): 35599aaaabbbb0438686dd79915e943895d1e276 Cert Hash(sha256): 96ebd75aaaabbbbb0db31f7a83891533eeada0351ce56b84f3918941c9cba610 Signature Hash: f905cf5aaaabbbb2548c592c593ee6864c9c2dc3ec305da3f4d6751a6ff17afd ... CERT_KEY_PROV_INFO_PROP_ID(2): Key Container = Contoso CA Unique container name: 944d5680aaaabbbb95b1cb4f50ba2b71_6e4d3030-8aae-40f0-9282-d69ccdd4ff34 Provider = Microsoft Software Key Storage Provider ProviderType = 0 Flags = 20 (32) CRYPT_MACHINE_KEYSET -- 20 (32) KeySpec = 2 -- AT_SIGNATURE -
KeySpec如果值为,2 -- AT_SIGNATURE请将其更改为0 -- XCN_AT_NONE:-
使用扩展名创建文件
.inf。 文件的内容(KeyProv.inf)类似于:[Properties] 2 = "{text}" ; Add Key Provider Information property _continue_="Container = CONTAINER_NAME&" // Replace the "CONTAINER_NAME" with the CA Key Container name of the certificate that has the Serial Number "21000000044a30cdeaaaae7b08000000000004"; Keep the sign '&' in the end; _continue_="Provider = Microsoft Software Key Storage Provider&" _continue_="ProviderType = 0&" _continue_="Flags = 0x20&" _continue_="KeySpec = 0" -
使用值所在的
KeySpec``2证书序列号运行以下命令:certutil -repairstore my "21000000044a30cdeaaaae7b08000000000004" KeyProv.inf注意
可以通过选择每个证书并选择“常规**”选项卡上的“查看证书”来检查 CA 属性中每个 CA 证书的哈希。然后,在“详细信息**”选项卡上,选择**“序列号**”。
-
重新执行以下命令,然后检查该值是否
KeySpec为0:certutil -v -store my > c:\temp\machine-new.txt -
对值为 的其他每个 CA 证书
KeySpec``2使用上述步骤。
所有 CA 证书都具有 KeySpec 值 0后,可以尝试使用现有密钥对再次续订 CA 证书。
详细信息
对于使用加密下一代(CNG)提供程序生成密钥的证书,没有密钥规范的概念,并且 KeySpec 值始终 0如此。
KeySpec 值和关联含义:
| Keyspec 值 | 值 | 含义 |
|---|---|---|
0 |
AT_NONE |
证书是 CNG 证书。 |
1 |
AT_KEYEXCHANGE |
对于旧版 CAPI(非 CNG)证书,密钥可用于签名和解密。 |
2 |
AT_SIGNATURE |
对于旧版 CAPI(非 CNG)证书,密钥只能用于签名。 |