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