1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty.handler.ssl.util;
18
19 import org.bouncycastle.asn1.x500.X500Name;
20 import org.bouncycastle.cert.X509CertificateHolder;
21 import org.bouncycastle.cert.X509v3CertificateBuilder;
22 import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
23 import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
24 import org.bouncycastle.operator.ContentSigner;
25 import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
26
27 import java.math.BigInteger;
28 import java.security.KeyPair;
29 import java.security.PrivateKey;
30 import java.security.SecureRandom;
31 import java.security.cert.X509Certificate;
32 import java.util.Date;
33
34 import static io.netty.handler.ssl.util.SelfSignedCertificate.newSelfSignedCertificate;
35
36
37
38
39 final class BouncyCastleSelfSignedCertGenerator {
40 static String[] generate(String fqdn, KeyPair keypair, SecureRandom random, Date notBefore, Date notAfter,
41 String algorithm) throws Exception {
42 PrivateKey key = keypair.getPrivate();
43
44
45 X500Name owner = new X500Name("CN=" + fqdn);
46 X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
47 owner, new BigInteger(64, random), notBefore, notAfter, owner, keypair.getPublic());
48
49 ContentSigner signer = new JcaContentSignerBuilder(
50 algorithm.equalsIgnoreCase("EC") ? "SHA256withECDSA" : "SHA256WithRSAEncryption").build(key);
51 X509CertificateHolder certHolder = builder.build(signer);
52 X509Certificate cert = new JcaX509CertificateConverter()
53 .setProvider(BouncyCastleUtil.getBcProviderJce())
54 .getCertificate(certHolder);
55 cert.verify(keypair.getPublic());
56
57 return newSelfSignedCertificate(fqdn, key, cert);
58 }
59
60 private BouncyCastleSelfSignedCertGenerator() { }
61 }