2

KeyPair に対する X509Certificate を作成するにはどうすればよいですか? (私のクラスには既に KeyPair があり、公開鍵を保持する証明書を作成してキーストアに保存する必要があります)。

X509Certificate コンストラクターが公開鍵を受け取り、それを keystore.setEntry( pvtkey, cert) を介して保存できることを期待していましたが、新しい証明書と鍵ペアを関連付けるのに役立つものは何も見つかりませんでした...

何か案が?

編集: 証明書チェーンを null として渡そうとしましたが、うまくいきません。http://bugs.sun.com/bugdatabase/view_bug.do; jsessionid=5866fda73ac1258fcfebef9c3234?bug_id=4906869で報告されたバグのようです。

ありがとう!

4

2 に答える 2

3

Oracle Java には、X509Certificate を作成するための Java クラスはありません。あなたはする必要があります

  1. keytool プログラムを使用する (簡単ですが、Java ではありません)、または
  2. 独自のカスタム コードを作成する (難しい)、
  3. bouncycastle のようなサードパーティのライブラリを使用します (比較的簡単です)。

編集 :

これらのエントリはかなりの期間存在する可能性があるため、上記のステートメントは Java 7 以前に適用されることを付け加えておきます。

于 2012-07-17T23:05:37.093 に答える
1

自己署名された X509Certificate を生成する方法に関する解決策に関連する質問があります: リンク

この方法で BouncyCastle クラスを使用してみてください。

// generate a key pair
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGenerator.initialize(4096, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();

// build a certificate generator
X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
X500Principal dnName = new X500Principal("cn=Example_CN");

// add some options
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
certGen.setSubjectDN(new X509Name("dc=Example_Name"));
certGen.setIssuerDN(dnName); // use the same
// yesterday
certGen.setNotBefore(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000));
// in 2 years
certGen.setNotAfter(new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000));
certGen.setPublicKey(keyPair.getPublic());
certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping));

// finally, sign the certificate with the private key of the same KeyPair
X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC");

セキュリティ プロバイダを忘れずに追加してください。

Security.addProvider(new BouncyCastleProvider());
于 2017-08-29T04:37:55.267 に答える