9.6. 克隆已重新密钥的 CA


当证书过期时,必须替换它。这可以通过续订证书来完成,该证书可重新使用原始密钥对来生成新证书,或者通过生成新的密钥对和证书来完成。第二种方法称为 re-keying

当 CA 重新密钥时,新密钥对存储在其证书数据库中,它们是正常操作的密钥引用。但是,对于克隆子系统,克隆过程会检查存储在其 CS.cfg 配置文件中的 CA 私钥 ID - 和这些密钥 ID 在证书数据库密钥更改时不会更新。

如果 CA 已重新密钥,然后管理员尝试克隆它,克隆的 CA 无法为重新密钥的证书生成任何证书,并在错误日志中显示出错信息:

CertUtil::createSelfSignedCert() - CA private key is null!

克隆已重新密钥的 CA:

  1. 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
  2. 打印存储在 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

    在本例中,只有审计签名密钥是相同的,其他密钥已更改。

  3. 使用上一步中返回的密钥,将其从未签名值(即 certutil 返回)转换为签署 Java BigIntegers (这是如何在证书系统数据库中存储的密钥)。

    这可以通过计算器或使用 例 9.1 “certutil 到 BigInteger 转换程序” 中的脚本完成。

  4. 将新密钥值复制到 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
  5. 克隆 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
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat, Inc.