使用Bouncy Castle Java生成X509证书
我正在寻找一个在Java中使用BC生成X509证书的示例或教程 很多示例都有/使用不推荐的API。我查看了BC,但它没有显示哪个类做了什么,或者没有适当的文档/示例使用Bouncy Castle Java生成X509证书,java,cryptography,x509certificate,bouncycastle,Java,Cryptography,X509certificate,Bouncycastle,我正在寻找一个在Java中使用BC生成X509证书的示例或教程 很多示例都有/使用不推荐的API。我查看了BC,但它没有显示哪个类做了什么,或者没有适当的文档/示例 如果您对它有任何想法,请告诉我一个教程,在那里我可以使用BC生成X509证书。[生成并将公钥和私钥写入文件]似乎是要使用的类。以下是在创建KeyPairGenerator时使用新API的一些示例: private KeyPairGenerator createKeyPairGenerator(String algorithmIden
如果您对它有任何想法,请告诉我一个教程,在那里我可以使用BC生成X509证书。[生成并将公钥和私钥写入文件]似乎是要使用的类。以下是在创建KeyPairGenerator时使用新API的一些示例:
private KeyPairGenerator createKeyPairGenerator(String algorithmIdentifier,
int bitCount) throws NoSuchProviderException,
NoSuchAlgorithmException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
algorithmIdentifier, BouncyCastleProvider.PROVIDER_NAME);
kpg.initialize(bitCount);
return kpg;
}
创建密钥对:
private KeyPair createKeyPair(String encryptionType, int byteCount)
throws NoSuchProviderException, NoSuchAlgorithmException
{
KeyPairGenerator keyPairGenerator = createKeyPairGenerator(encryptionType, byteCount);
KeyPair keyPair = keyPairGenerator.genKeyPair();
return keyPair;
}
KeyPair keyPair = createKeyPair("RSA", 4096);
将内容转换为PEM(可以写入文件):
创建X509证书:
X509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(
serverCertificate, new BigInteger("1"),
new Date(System.currentTimeMillis()),
new Date(System.currentTimeMillis() + 30L * 365L * 24L * 60L * 60L * 1000L),
jcaPKCS10CertificationRequest.getSubject(),
jcaPKCS10CertificationRequest.getPublicKey()
/*).addExtension(
new ASN1ObjectIdentifier("2.5.29.35"),
false,
new AuthorityKeyIdentifier(keyPair.getPublic().getEncoded())*/
).addExtension(
new ASN1ObjectIdentifier("2.5.29.19"),
false,
new BasicConstraints(false) // true if it is allowed to sign other certs
).addExtension(
new ASN1ObjectIdentifier("2.5.29.15"),
true,
new X509KeyUsage(
X509KeyUsage.digitalSignature |
X509KeyUsage.nonRepudiation |
X509KeyUsage.keyEncipherment |
X509KeyUsage.dataEncipherment));
签字:
ContentSigner sigGen = new JcaContentSignerBuilder("SHA256withRSA").build(signingKeyPair.getPrivate());
X509CertificateHolder x509CertificateHolder = certificateBuilder.build(sigGen);
org.spongycastle.asn1.x509.Certificate eeX509CertificateStructure =
x509CertificateHolder.toASN1Structure();
return eeX509CertificateStructure;
}
private X509Certificate readCertificateFromASN1Certificate(
org.spongycastle.asn1.x509.Certificate eeX509CertificateStructure,
CertificateFactory certificateFactory)
throws IOException, CertificateException { //
// Read Certificate
InputStream is1 = new ByteArrayInputStream(eeX509CertificateStructure.getEncoded());
X509Certificate signedCertificate =
(X509Certificate) certificateFactory.generateCertificate(is1);
return signedCertificate;
}
认证机构:
certificateFactory = CertificateFactory.getInstance("X.509",
BouncyCastleProvider.PROVIDER_NAME);
我听说@GregS将按小时雇佣。指向wiki的链接已失效。更新:不要使用SHA1作为证书签名。它在2014年已经被正式淘汰(NIST SP800-57适用于美国政府,CABforum BR适用于网络,但浏览器直到2015年底或2016年才强制执行后者),2017-02年史蒂文斯集团和谷歌发现了一个实际的SHA1冲突,因此几乎所有的实现,包括Java 8u141以上,现在都禁止了它。一定要改用SHA256。
certificateFactory = CertificateFactory.getInstance("X.509",
BouncyCastleProvider.PROVIDER_NAME);