1require "openssl"
2
3key = OpenSSL::PKey::EC.generate("prime256v1") # P-256
4name = OpenSSL::X509::Name.parse("/CN=localhost")
5
6cert = OpenSSL::X509::Certificate.new
7cert.version = 2 # zero-based: 2 means X.509 v3
8cert.serial = OpenSSL::BN.rand(127) # random, positive
9cert.subject = name
10cert.issuer = name # self-signed
11cert.public_key = key
12cert.not_before = Time.now
13cert.not_after = cert.not_before + 365 * 24 * 60 * 60
14
15extensions = OpenSSL::X509::ExtensionFactory.new(cert, cert) # subject and issuer certificate
16cert.add_extension(extensions.create_extension("subjectAltName", "DNS:localhost,IP:127.0.0.1", false))
17cert.add_extension(extensions.create_extension("basicConstraints", "CA:FALSE", true))
18cert.add_extension(extensions.create_extension("keyUsage", "digitalSignature", true))
19cert.add_extension(extensions.create_extension("extendedKeyUsage", "serverAuth", false))
20cert.sign(key, OpenSSL::Digest.new("SHA256"))
21
22File.write("cert.pem", cert.to_pem)
23File.write("key.pem", key.private_to_pem)