2020-07-22 01:00:20 -05:00
|
|
|
require 'openssl'
|
|
|
|
|
|
|
|
class SSL
|
|
|
|
def initialize; end
|
|
|
|
|
|
|
|
def generate_cert
|
|
|
|
key = generate_keypair(2048)
|
|
|
|
name = OpenSSL::X509::Name.parse('/CN=nobody/DC=example')
|
|
|
|
|
|
|
|
cert = OpenSSL::X509::Certificate.new
|
|
|
|
cert.version = 2
|
|
|
|
cert.serial = 0
|
|
|
|
cert.not_before = Time.now
|
|
|
|
cert.not_after = Time.now + 3600
|
|
|
|
cert.public_key = key.public_key
|
|
|
|
cert.subject = name
|
|
|
|
[cert, name, key]
|
2020-07-22 02:12:48 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def generate_keypair(size)
|
|
|
|
key = generate_key(size)
|
|
|
|
open 'private_key.pem', 'w' do |io| io.write key.to_pem end
|
|
|
|
open 'public_key.pem', 'w' do |io| io.write key.public_key.to_pem end
|
|
|
|
key
|
|
|
|
end
|
2020-07-22 01:00:20 -05:00
|
|
|
|
|
|
|
def generate_key(size)
|
|
|
|
OpenSSL::PKey::RSA.new size
|
|
|
|
end
|
|
|
|
|
|
|
|
def load_key(path, passphrase = nil)
|
|
|
|
if passphrase
|
|
|
|
OpenSSL::PKey::RSA.new(File.read(path), passphrase)
|
|
|
|
else
|
|
|
|
OpenSSL::PKey::RSA.new(File.read(path))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# sign cert generated from generate_cert method.
|
|
|
|
# cert, name, key = generate_cert
|
|
|
|
def self_sign_key(cert, name, key)
|
|
|
|
cert.issuer = name
|
|
|
|
cert.sign key, OpenSSL::Digest.new('SHA1')
|
|
|
|
open 'certificate.pem', 'w' do |io| io.write cert.to_pem end
|
|
|
|
end
|
|
|
|
|
|
|
|
def new_ssl_context(cert, key)
|
|
|
|
context = OpenSSL::SSL::SSLContext.new
|
|
|
|
context.cert = cert
|
|
|
|
context.key = key
|
|
|
|
context
|
2020-07-22 02:12:48 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def load_cert(path)
|
|
|
|
OpenSSL::X509::Certificate.new File.read path
|
|
|
|
end
|
2020-07-22 01:00:20 -05:00
|
|
|
end
|