1import java.io.FileWriter
2import java.security.KeyPairGenerator
3import java.security.spec.ECGenParameterSpec
4import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
5import org.bouncycastle.asn1.x500.X500Name
6import org.bouncycastle.asn1.x509.Extension
7import org.bouncycastle.asn1.x509.ExtensionsGenerator
8import org.bouncycastle.asn1.x509.GeneralName
9import org.bouncycastle.asn1.x509.GeneralNames
10import org.bouncycastle.openssl.jcajce.JcaPEMWriter
11import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator
12import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder
13import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder
14
15fun main() {
16 val keys = KeyPairGenerator.getInstance("EC").apply { initialize(ECGenParameterSpec("secp256r1")) }.generateKeyPair()
17
18 val extensions = ExtensionsGenerator().apply {
19 addExtension(
20 Extension.subjectAlternativeName, false,
21 GeneralNames(arrayOf(
22 GeneralName(GeneralName.dNSName, "api.example.com"),
23 GeneralName(GeneralName.dNSName, "www.example.com"),
24 )),
25 )
26 }
27
28 val csr = JcaPKCS10CertificationRequestBuilder(X500Name("C=US, O=Example Corp, CN=api.example.com"), keys.public)
29 .addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, extensions.generate())
30 .build(JcaContentSignerBuilder("SHA256withECDSA").build(keys.private))
31
32 JcaPEMWriter(FileWriter("csr.pem")).use { it.writeObject(csr) }
33 JcaPEMWriter(FileWriter("key.pem")).use { it.writeObject(JcaPKCS8Generator(keys.private, null)) }
34}