如何在Keystore上创建密钥库的证书?

时间:2012-07-17 14:45:21

标签: java security cryptography x509certificate key-pair

如何为我的KeyPair创建X509Certificate? (我的班级已经拥有KeyPair,我需要创建一个证书,该证书将保存我的公钥,然后将其存储在密钥库中。)

我希望有一个X509Certificate构造函数能够接收我的公钥,然后通过keystore.setEntry(pvtkey,cert)存储它,但我没有发现将新证书和我的密钥对关联起来没什么用处......

有什么想法吗?

编辑: 我还尝试将证书链传递为null但它不起作用,它看起来像http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=5866fda73ac1258fcfebef9c3234?bug_id=4906869上报告的错误

谢谢!

2 个答案:

答案 0 :(得分:3)

Oracle Java中没有Java类来创建X509Certificate。你要么

  1. 使用keytool程序(简单,但不是java)或
  2. 编写您自己的自定义代码(硬),
  3. 使用像bouncycastle这样的第三方库(相对容易)。
  4. 编辑:

    由于这些条目可以保留很长时间,我应该补充一点,上述语句适用于Java 7及更早版本。

答案 1 :(得分:0)

以下是解决方案如何生成自签名X509Certificate的相关问题: link

尝试以这种方式使用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());