【问题标题】:How to Create a Certificate on keystore to my KeyPair?如何在密钥库上为我的密钥对创建证书?
【发布时间】:2012-07-16 12:38:05
【问题描述】:
【问题讨论】:
标签:
java
security
cryptography
x509certificate
key-pair
【解决方案1】:
Oracle Java 中没有用于创建 X509Certificate 的 Java 类。你要么必须
- 使用 keytool 程序(简单,但不是 java),或者
- 编写您自己的自定义代码(硬),
- 使用第三方库,如 bouncycastle(相对简单)。
编辑:
由于这些条目可以保留相当长的时间,我应该补充一点,上述陈述适用于 Java 7 及更早版本。
【解决方案2】:
这是一个与如何生成自签名 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());