Созданный и подписанный сертификат не выглядит как подписанный в j Ruby с использованием OpenSSL - PullRequest
0 голосов
/ 03 апреля 2020

, поэтому я создаю сертификаты p12 в j ruby, используя OpenSSL. У меня есть сертификат Certificate Authority ca.crt и его закрытый ключ ca.key, оба из которых я не могу изменить, и я не могу использовать любой другой гем, кроме OpenSSL . Тогда у меня есть этот кусок кода:

require 'openssl'

def gen_key(name)
  key = OpenSSL::PKey::RSA.new(2048)
  file = File.new(name, "w")
  file.write(key)
  file.close
end

def get_key(name)
  OpenSSL::PKey::RSA.new File.open(name)
end

def get_cert(name)
  OpenSSL::X509::Certificate.new File.open(name)
end

def csr(key)
  options = { 
  :country      => 'country',
  :city         => 'city',
  :organization => 'organization',
  :department   => 'department', 
  :common_name  => 'c_name',
  :email        => 'email'
  }

  request = OpenSSL::X509::Request.new
  request.subject = OpenSSL::X509::Name.new([
  ['C',             options[:country], OpenSSL::ASN1::PRINTABLESTRING],
  ['L',             options[:city],         OpenSSL::ASN1::PRINTABLESTRING],
  ['O',             options[:organization], OpenSSL::ASN1::UTF8STRING],
  ['CN',            options[:common_name],  OpenSSL::ASN1::UTF8STRING],
  ['OU',            options[:department],   OpenSSL::ASN1::UTF8STRING],
  ['emailAddress',  options[:email],        OpenSSL::ASN1::UTF8STRING] 
  ])  
  request.public_key = key.public_key
  request.sign(key, OpenSSL::Digest::SHA256.new)
end 

def sign_csr(request, key, ca_cert)    
  csr_cert = OpenSSL::X509::Certificate.new
  csr_cert.serial = rand(00000000000000000001..99999999999999999999)
  csr_cert.not_before = Time.now
  csr_cert.not_after = Time.now + 180*24*60*60
  csr_cert.subject = request.subject
  csr_cert.public_key = request.public_key
  csr_cert.issuer = ca_cert.subject

  extension_factory = OpenSSL::X509::ExtensionFactory.new
  extension_factory.subject_certificate = csr_cert
  extension_factory.issuer_certificate = ca_cert 
  csr_cert.add_extension(extension_factory.create_extension('basicConstraints', 'CA:FALSE'))
  csr_cert.add_extension(extension_factory.create_extension('subjectKeyIdentifier', 'hash'))

  csr_cert.sign(key, OpenSSL::Digest::SHA256.new)
end

def create_p12(password, name, user_public, cert, ca_cert)
  p12 = OpenSSL::PKCS12.create(password, name, user_public, cert, [ca_cert])
  file = File.new("#{name}.p12", "w")
  file.write(p12.to_der)
  file.close
end

def certify
  puts "create user.key"
  gen_key("user.key")
  puts "load user and CA keys"
  user_key = get_key("user.key")
  ca_key = get_key("ca.key")
  puts "csr user"
  user_csr = csr(user_key)
  puts "get ca cert"
  ca_cert = get_cert("ca.crt")
  puts "signed user csr"
  signed_user_csr = sign_csr(user_csr, ca_key, ca_cert)
  puts "create p12"
  create_p12("password","testp12", user_key, signed_user_csr, ca_cert)
end

certify

Код далеко не оптимизирован и не окончательный, сейчас я просто пытаюсь правильно создать сертификат. Сначала я создаю новый ключ RSA, который я сохраняю в файле user.key. Затем, используя этот ключ, я создаю новый запрос с предметными данными, которые я затем подписываю. Наконец, я подписываю сертификат с помощью ca.key и в качестве издателя использую тему из ca.crt и упаковываю ее в сертификат p12. Но я думаю, что делаю что-то не так. Поскольку созданный сертификат не выглядит так, как будто он подписан ЦС, и вместо этого он подробно говорит о состоянии: «Не удалось найти эмитента этого сертификата».

Итак, мой вопрос: что я делаю не так? Я думаю, что я написал код правильно, я следовал каждому руководству, которое я мог найти, но сертификат всегда остается в том же состоянии. Мой коллега говорит мне, что в старом bash linux сценарии, который я должен заменить этим, сертификат также подписан с помощью ca.crt, но я не нашел ни одного фрагмента кода в ruby, с которым я мог бы сделать это.

Спасибо

...