|
require "openssl" |
|
|
|
def setup_ca |
|
key = OpenSSL::PKey::EC.generate("prime256v1") |
|
cert = OpenSSL::X509::Certificate.new |
|
cert.version = 2 |
|
cert.serial = 12345 |
|
cert.subject = OpenSSL::X509::Name.parse_rfc2253("CN=Fake root CA for tweetdeck.twitter.com") |
|
cert.issuer = cert.subject |
|
cert.not_before = Time.utc(2023, 8, 22) |
|
cert.not_after = Time.utc(2035, 8, 22) |
|
cert.public_key = key |
|
|
|
ef = OpenSSL::X509::ExtensionFactory.new |
|
ef.subject_certificate = ef.issuer_certificate = cert |
|
cert.add_extension(ef.create_extension("basicConstraints", "CA:TRUE", true)) |
|
cert.add_extension(ef.create_extension("keyUsage", "digitalSignature,keyCertSign,cRLSign", true)) |
|
cert.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false)) |
|
|
|
cert.sign(key, "sha256") |
|
|
|
File.write("ca_cert.pem", cert.to_pem) |
|
File.write("ca_key.pem", key.to_pem) |
|
|
|
[cert, key] |
|
end |
|
|
|
def setup_ee(ca_cert, ca_key) |
|
key = OpenSSL::PKey::EC.generate("prime256v1") |
|
cert = OpenSSL::X509::Certificate.new |
|
cert.version = 2 |
|
cert.serial = OpenSSL::Random.random_bytes(16).unpack1("H*").to_i(16) |
|
cert.subject = OpenSSL::X509::Name.parse_rfc2253("CN=Fake EE for tweetdeck.twitter.com") |
|
cert.issuer = ca_cert.subject |
|
cert.not_before = Time.utc(2023, 8, 22) |
|
cert.not_after = Time.utc(2035, 8, 22) |
|
cert.public_key = key |
|
|
|
ef = OpenSSL::X509::ExtensionFactory.new |
|
ef.subject_certificate = ef.issuer_certificate = cert |
|
cert.add_extension(ef.create_extension("basicConstraints", "CA:FALSE", false)) |
|
cert.add_extension(ef.create_extension("keyUsage", "digitalSignature", true)) |
|
cert.add_extension(ef.create_extension("extendedKeyUsage", "serverAuth", true)) |
|
cert.add_extension(ef.create_extension("subjectAltName", "DNS:tweetdeck.twitter.com", false)) |
|
cert.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false)) |
|
cert.add_extension(ef.create_extension("authorityKeyIdentifier", "keyid:always", false)) |
|
|
|
cert.sign(ca_key, "sha256") |
|
|
|
File.write("ee_cert.pem", cert.to_pem) |
|
File.write("ee_key.pem", key.to_pem) |
|
|
|
[cert, key] |
|
end |
|
|
|
if File.exist?("cert.pem") |
|
warn "certificate already exists?" |
|
exit 1 |
|
end |
|
|
|
arg = setup_ca |
|
setup_ee(*arg) |
cache.rhe.jp の nginx においてみた