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.jce.provider.BouncyCastleProvider;
25 import org.bouncycastle.operator.ContentSigner;
26 import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
27
28 import java.math.BigInteger;
29 import java.security.KeyPair;
30 import java.security.PrivateKey;
31 import java.security.Provider;
32 import java.security.SecureRandom;
33 import java.security.cert.X509Certificate;
34 import java.util.Date;
35
36 import static io.netty.handler.ssl.util.SelfSignedCertificate.newSelfSignedCertificate;
37
38
39
40
41 final class BouncyCastleSelfSignedCertGenerator {
42
43 private static final Provider PROVIDER = new BouncyCastleProvider();
44
45 static String[] generate(String fqdn, KeyPair keypair, SecureRandom random, Date notBefore, Date notAfter,
46 String algorithm) throws Exception {
47 PrivateKey key = keypair.getPrivate();
48
49
50 X500Name owner = new X500Name("CN=" + fqdn);
51 X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
52 owner, new BigInteger(64, random), notBefore, notAfter, owner, keypair.getPublic());
53
54 ContentSigner signer = new JcaContentSignerBuilder(
55 algorithm.equalsIgnoreCase("EC") ? "SHA256withECDSA" : "SHA256WithRSAEncryption").build(key);
56 X509CertificateHolder certHolder = builder.build(signer);
57 X509Certificate cert = new JcaX509CertificateConverter().setProvider(PROVIDER).getCertificate(certHolder);
58 cert.verify(keypair.getPublic());
59
60 return newSelfSignedCertificate(fqdn, key, cert);
61 }
62
63 private BouncyCastleSelfSignedCertGenerator() { }
64 }