1import java.io.FileWriter;
2import java.security.KeyPair;
3import java.security.KeyPairGenerator;
4import java.security.spec.ECGenParameterSpec;
5import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
6import org.bouncycastle.asn1.x500.X500Name;
7import org.bouncycastle.asn1.x509.Extension;
8import org.bouncycastle.asn1.x509.ExtensionsGenerator;
9import org.bouncycastle.asn1.x509.GeneralName;
10import org.bouncycastle.asn1.x509.GeneralNames;
11import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
12import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator;
13import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
14import org.bouncycastle.pkcs.PKCS10CertificationRequest;
15import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder;
16
17public class Csr {
18 public static void main(String[] args) throws Exception {
19 // The JDK generates the key; Bouncy Castle builds the PKCS#10 request (the JDK has no CSR API)
20 KeyPairGenerator generator = KeyPairGenerator.getInstance("EC");
21 generator.initialize(new ECGenParameterSpec("secp256r1")); // P-256
22 KeyPair keys = generator.generateKeyPair();
23
24 ExtensionsGenerator extensions = new ExtensionsGenerator();
25 extensions.addExtension(Extension.subjectAlternativeName, false, new GeneralNames(new GeneralName[] {
26 new GeneralName(GeneralName.dNSName, "api.example.com"),
27 new GeneralName(GeneralName.dNSName, "www.example.com"),
28 }));
29
30 PKCS10CertificationRequest csr = new JcaPKCS10CertificationRequestBuilder(
31 new X500Name("C=US, O=Example Corp, CN=api.example.com"), keys.getPublic())
32 .addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, extensions.generate())
33 .build(new JcaContentSignerBuilder("SHA256withECDSA").build(keys.getPrivate()));
34
35 try (JcaPEMWriter out = new JcaPEMWriter(new FileWriter("csr.pem"))) {
36 out.writeObject(csr);
37 }
38 try (JcaPEMWriter out = new JcaPEMWriter(new FileWriter("key.pem"))) {
39 out.writeObject(new JcaPKCS8Generator(keys.getPrivate(), null)); // PKCS#8, unencrypted
40 }
41 }
42}
43