10.8. 再キーが設定された CA のクローン作成

証明書の期限が切れたら、置き換える必要があります。これは、元のキーペアを再利用して新しい証明書を生成する証明書を更新するか、新しいキーペアと証明書を生成することによって実行できます。2 つ目の方法は 再キーイング と呼ばれます。
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. ステップ 2 でキーを取得し、これらを署名なし値 (certutil を返すもの) から署名済み Java BigInteger (Certificate System データベースに格納) に変換します。
    これは、calculator または 例10.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 のクローン作成」 の説明に従って CA のクローンを作成します。

例10.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