, поэтому я создаю сертификаты 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, с которым я мог бы сделать это.
Спасибо