12

ハイ・ガイズ!bouncycastle を使用して x.509 証明書を作成しようとしています。この証明書は、別の証明書によって署名され、PEM ベース 64 形式で保存される必要があります。

私はすでに自己署名証明書 (公開鍵と秘密鍵) を持っています。今、私は新しいものを作成し、既存の自己署名証明書で署名したいと考えています。

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGenerator.initialize(1024, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();

X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
X500Principal dnName = new X500Principal("CN=Sergey");
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
certGen.setSubjectDN(dnName);
certGen.setIssuerDN(caCert.getSubjectX500Principal());
certGen.setNotBefore(validityBeginDate);
certGen.setNotAfter(validityEndDate);
certGen.setPublicKey(keyPair.getPublic());
certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");

certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(caCert));
certGen.addExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(keyPair.getPublic()));

X509Certificate cert = certGen.generate(caCertPrivateKey, "BC");

検証は例外なく合格しました。これは、私の観点からは、caCert によって正常に署名されたことを意味します。

cert.verify(caCert.getPublicKey());

次に、PEM base 64 にデコードします。

PEMWriter pemWriter = new PEMWriter(new PrintWriter(System.out));
pemWriter.writeObject(cert);
pemWriter.flush();

出力に次のようなものが表示されます。

-----証明書の開始-----

MIIDDjCCAnegAwIBAgIBFDAN........

---エンド証明書-----

それを開くと、次のように表示されます。

ここに画像の説明を入力

caCert によって正常に署名された場合、証明書チェーンがないのはなぜですか?

証明書チェーンを期待どおりに表示するには、コードで何を変更する必要がありますか?

4

1 に答える 1

8

解決策を見つけることができました。実際、コードは期待どおりに機能します。caRoot 証明書が信頼できるストアに追加されていないため、証明書のチェーンが表示されませんでした。自己署名証明書を信頼されたルート認証センターに追加すると、期待どおりに認証チェーン全体が表示されます。

于 2013-03-01T10:19:26.463 に答える