Skip to content

Instantly share code, notes, and snippets.

@mikekelly
Forked from VimleshS/ruby_cert.rb
Created February 28, 2021 20:19
Show Gist options
  • Save mikekelly/51220b46fbf6129fbbad79bb6f33a5b5 to your computer and use it in GitHub Desktop.
Save mikekelly/51220b46fbf6129fbbad79bb6f33a5b5 to your computer and use it in GitHub Desktop.

Revisions

  1. @VimleshS VimleshS created this gist Aug 30, 2016.
    102 changes: 102 additions & 0 deletions ruby_cert.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,102 @@
    #Reference
    #https://devnotcorp.wordpress.com/2012/08/21/usage-examples-of-rubys-openssl-lib/



    #!/usr/bin/ruby
    require 'openssl'
    require 'date'
    require 'time'

    # Create key
    key1 = OpenSSL::PKey::RSA.new(2048)
    open("private_key.pem", "w") do |io| io.write(key1.to_pem) end
    open("public_key.pem", "w") do |io| io.write(key1.public_key.to_pem) end
    puts("key1.private?=#{key1.private?}")

    # Export key
    cipher = OpenSSL::Cipher::Cipher.new("AES-128-CBC")
    pass_phrase = "this is my secure pass phrase"
    key1_secure = key1.export(cipher, pass_phrase)
    open("private_key.secure.pem", "w") do |io| io.write(key1_secure) end

    # Load key
    key2 = OpenSSL::PKey::RSA.new File.read("private_key.pem")
    puts("key2.private?=#{key2.private?}")

    key3 = OpenSSL::PKey::RSA.new(File.read("public_key.pem"))
    puts("key3.private?=#{key3.private?}")

    # Load encrypted key
    key4_pem = File.read("private_key.secure.pem")
    key4 = OpenSSL::PKey::RSA.new(key4_pem, pass_phrase)
    puts("key4.private?=#{key4.private?}")

    # Create cert
    name = OpenSSL::X509::Name.parse("CN=auralis/DC=topalis/DC=com")
    cert = OpenSSL::X509::Certificate.new()
    cert.version = 2
    cert.serial = 0
    cert.not_before = Time.new()
    cert.not_after = cert.not_before + (60*60*24*365)
    puts "cert.not_before=#{cert.not_before}"
    puts "cert.not_after=#{cert.not_after}"
    cert.public_key = key1.public_key
    cert.subject = name

    # Sign cert
    cert.issuer = name
    cert.sign key1, OpenSSL::Digest::SHA1.new()
    open("certificate.pem", "w") do |io| io.write(cert.to_pem) end

    # Load cert
    cert2 = OpenSSL::X509::Certificate.new(File.read("certificate.pem"))

    # Verify cert
    puts("cert2.verify key1=#{cert2.verify key1}")

    # Create CA key
    ca_key = OpenSSL::PKey::RSA.new(2048)
    open("ca_key.pem", "w") do |io| io.write(ca_key.export(cipher, pass_phrase)) end

    # Create CA cert
    ca_name = OpenSSL::X509::Name.parse("CN=ca/DC=topalis/DC=com")
    ca_cert = OpenSSL::X509::Certificate.new()
    ca_cert.serial = 0
    ca_cert.version = 2
    ca_cert.not_before = Time.new()
    ca_cert.not_after = ca_cert.not_before + (60*60*24*365)
    ca_cert.public_key = ca_key.public_key
    ca_cert.subject = ca_name
    ca_cert.issuer = ca_name
    extension_factory = OpenSSL::X509::ExtensionFactory.new()
    extension_factory.subject_certificate = ca_cert
    extension_factory.issuer_certificate = ca_cert
    extension_factory.create_extension("subjectKeyIdentifier", "hash")
    extension_factory.create_extension("basicConstraints", "CA:TRUE", true)
    extension_factory.create_extension("keyUsage", "cRLSign,keyCertSign", true)
    ca_cert.sign(ca_key, OpenSSL::Digest::SHA1.new())
    open("ca_cert.pem", "w") do |io| io.write(ca_cert.to_pem) end

    # Sign file
    # openssl smime -sign -in example.mobileconfig -out signed2.mobileconfig -signer ca_cert.pem -inkey ca_key.pem -outform der -nodetach
    profile = File.read("LBS_BausparApp.mobileprovision")
    profile_signed = OpenSSL::PKCS7.sign(ca_cert, ca_key, profile, [], OpenSSL::PKCS7::BINARY)
    open("signed.mobileconfig", "w") do |io| io.write(profile_signed.to_der) end

    # Encrypt file
    profile_encrypted = OpenSSL::PKCS7::encrypt([ca_cert], profile_signed.to_der, cipher, OpenSSL::PKCS7::BINARY)
    open("encrypted.mobileconfig", "w") do |io| io.write(profile_encrypted) end

    # Decrypt file
    profile_encrypted2 = OpenSSL::PKCS7.new(File.read("encrypted.mobileconfig"))
    profile_decrypted = profile_encrypted2.decrypt(ca_key, ca_cert)
    profile_signed2 = OpenSSL::PKCS7.new(profile_decrypted)
    puts "profile_signed2.signers()[0].name=#{profile_signed2.signers()[0].name}"

    # Verify
    # openssl smime -verify -inform der -in signed.mobileconfig -signer ca_cert.pem
    store = OpenSSL::X509::Store.new()
    store.add_cert(ca_cert)
    puts "profile_signed2.verify([ca_cert], store)=#{profile_signed2.verify([ca_cert], store)}"
    puts profile_signed2.data