1import java.io.FileWriter;
2import java.math.BigInteger;
3import java.security.KeyPair;
4import java.security.KeyPairGenerator;
5import java.security.SecureRandom;
6import java.security.spec.ECGenParameterSpec;
7import java.time.Duration;
8import java.time.Instant;
9import java.util.Date;
10import org.bouncycastle.asn1.x500.X500Name;
11import org.bouncycastle.asn1.x509.BasicConstraints;
12import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
13import org.bouncycastle.asn1.x509.Extension;
14import org.bouncycastle.asn1.x509.GeneralName;
15import org.bouncycastle.asn1.x509.GeneralNames;
16import org.bouncycastle.asn1.x509.KeyPurposeId;
17import org.bouncycastle.asn1.x509.KeyUsage;
18import org.bouncycastle.cert.X509CertificateHolder;
19import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
20import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
21import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator;
22import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
23
24public class SelfSigned {
25 public static void main(String[] args) throws Exception {
26 KeyPairGenerator generator = KeyPairGenerator.getInstance("EC");
27 generator.initialize(new ECGenParameterSpec("secp256r1")); // P-256
28 KeyPair keys = generator.generateKeyPair();
29
30 X500Name name = new X500Name("CN=localhost");
31 Instant notBefore = Instant.now();
32 JcaX509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
33 name, // issuer = subject: self-signed
34 new BigInteger(127, new SecureRandom()), // random, positive serial
35 Date.from(notBefore), Date.from(notBefore.plus(Duration.ofDays(365))),
36 name, keys.getPublic());
37 builder.addExtension(Extension.subjectAlternativeName, false, new GeneralNames(new GeneralName[] {
38 new GeneralName(GeneralName.dNSName, "localhost"),
39 new GeneralName(GeneralName.iPAddress, "127.0.0.1"),
40 }));
41 builder.addExtension(Extension.basicConstraints, true, new BasicConstraints(false));
42 builder.addExtension(Extension.keyUsage, true, new KeyUsage(KeyUsage.digitalSignature));
43 builder.addExtension(Extension.extendedKeyUsage, false, new ExtendedKeyUsage(KeyPurposeId.id_kp_serverAuth));
44
45 X509CertificateHolder cert = builder.build(new JcaContentSignerBuilder("SHA256withECDSA").build(keys.getPrivate()));
46
47 try (JcaPEMWriter out = new JcaPEMWriter(new FileWriter("cert.pem"))) {
48 out.writeObject(cert);
49 }
50 try (JcaPEMWriter out = new JcaPEMWriter(new FileWriter("key.pem"))) {
51 out.writeObject(new JcaPKCS8Generator(keys.getPrivate(), null));
52 }
53 }
54}
55