9.6. 克隆已重新密钥的 CA
当证书过期时,必须替换它。这可以通过续订证书来完成,该证书可重新使用原始密钥对来生成新证书,或者通过生成新的密钥对和证书来完成。第二种方法称为 re-keying。
当 CA 重新密钥时,新密钥对存储在其证书数据库中,它们是正常操作的密钥引用。但是,对于克隆子系统,克隆过程会检查存储在其 CS.cfg
配置文件中的 CA 私钥 ID - 和这些密钥 ID 在证书数据库密钥更改时不会更新。
如果 CA 已重新密钥,然后管理员尝试克隆它,克隆的 CA 无法为重新密钥的证书生成任何证书,并在错误日志中显示出错信息:
CertUtil::createSelfSignedCert() - CA private key is null!
克隆已重新密钥的 CA:
在
CS.cfg
文件中查找所有私钥 ID。# grep privkey.id /var/lib/pki/ instance_name/ca/conf/CS.cfg cloning.signing.privkey.id =-4d798441aa7230910d4e1c39fa132ea228d5d1bc cloning.ocsp_signing.privkey.id =-3e23e743e0ddd88f2a7c6f69fa9f9bcebef1a60 cloning.subsystem.privkey.id =-c3c1b3b4e8f5dd6d2bdefd07581c0b15529536 cloning.sslserver.privkey.id =3023d30245804a4fab42be209ebb0dc683423a8f cloning.audit_signing.privkey.id=2fe35d9d46b373efabe9ef01b8436667a70df096
打印存储在 NSS 数据库中的所有当前私钥 ID,并将其与存储在
CS.cfg
文件中的私钥 ID 进行比较:# certutil -K -d alias certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services" Enter Password or Pin for "NSS Certificate DB": < 0> rsa a7b0944b7b8397729a4c8c9af3a9c2b96f49c6f3 caSigningCert cert-ca4-test-master < 1> rsa 6006094af3e5d02aaa91426594ca66cb53e73ac0 ocspSigningCert cert-ca4-test-master < 2> rsa d684da39bf4f2789a3fc9d42204596f4578ad2d9 subsystemCert cert-ca4-test-master < 3> rsa a8edd7c2b5c94f13144cacd99624578ae30b7e43 sslserverCert cert-ca4-test1 < 4> rsa 2fe35d9d46b373efabe9ef01b8436667a70df096 auditSigningCert cert-ca4-test1
在本例中,只有审计签名密钥是相同的,其他密钥已更改。
使用上一步中返回的密钥,将其从未签名值(即
certutil
返回)转换为签署 Java BigIntegers (这是如何在证书系统数据库中存储的密钥)。这可以通过计算器或使用 例 9.1 “certutil 到 BigInteger 转换程序” 中的脚本完成。
将新密钥值复制到
CS.cfg
文件中。# vim /var/lib/pki/ instance_name/ca/conf/CS.cfg cloning.signing.privkey.id =-584f6bb4847c688d65b373650c563d4690b6390d cloning.ocsp_signing.privkey.id =6006094af3e5d02aaa91426594ca66cb53e73ac0 cloning.subsystem.privkey.id =-297b25c640b0d8765c0362bddfba690ba8752d27 cloning.sslserver.privkey.id =-5712283d4a36b0ecebb3532669dba8751cf481bd cloning.audit_signing.privkey.id=2fe35d9d46b373efabe9ef01b8436667a70df096
- 克隆 CA,如 第 9.2 节 “克隆 CA” 所述。
例 9.1. certutil 到 BigInteger 转换程序
此 Java 程序可以将密钥输出从 certutil
转换为所需的 BigInteger 格式。
将它保存为 .java
文件,如 Test.java
。
import java.math.BigInteger; public class Test { public static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } public static void main(String[] args) { byte[] bytes = hexStringToByteArray(args[0]); BigInteger big = new BigInteger (bytes); System.out.println("Result is ==> " + big.toString(16)); } }
然后编译该文件:
# javac Test.java