Я пытаюсь создать самозаверяющий сертификат в ruby, но у меня проблемы. Вот что у меня сейчас есть:
require 'openssl'
if ARGV.length != 3 then
puts "USAGE: #{__FILE__} <type[der|pem]> <private-out> <public-out>"
exit
end
type = ARGV[0].downcase
privateKeyFile = ARGV[1]
publicKeyFile = ARGV[2]
values = [{ 'C' => 'US'},
{'ST' => 'SomeState'},
{ 'L' => 'SomeCity'},
{ 'O' => 'Organization'},
{'OU' => 'Organizational Unit'},
{'CN' => "somesite.com"}]
name = values.collect{ |l| l.collect { |k, v| "/#{k}=#{v}" }.join }.join
key = OpenSSL::PKey::RSA.generate(1024)
pub = key.public_key
ca = OpenSSL::X509::Name.parse(name)
cert = OpenSSL::X509::Certificate.new
cert.version = 2
cert.serial = 1
cert.subject = ca
cert.issuer = ca
cert.public_key = pub
cert.not_before = Time.now
cert.not_before = Time.now + (360 * 24 * 3600)
File.open(privateKeyFile + "." + type, "w") {|f| f.write key.send("to_#{type}") }
File.open(publicKeyFile + "." + type, "w") {|f| f.write cert.send("to_#{type}") }
Когда я пытаюсь использовать сгенерированный закрытый ключ и сертификат в apache, я получаю эту ошибку:
[Thu Mar 04 10:58:44 2010] [error] Init: Unable to read server certificate from file /etc/ssl/certs/gnarly.pem
[Thu Mar 04 10:58:44 2010] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Thu Mar 04 10:58:44 2010] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
Вот что говорит мой сертификат:
-----BEGIN CERTIFICATE-----
<lots of stuff>
-----END CERTIFICATE-----
Он называет себя сертификатом вместо CSR, что большинство вещей, которые я обнаружил в Интернете, говорит об этой ошибке apache2 (что я мог смешать CSR и CERT). Я предполагаю, что я не генерирую правильный тип сертификата. Возможно, мне придется изменить серийный номер или атрибуты версии. Кроме того, я нигде не занимаюсь самоподписанием, о чем я не знаю. Я знаю, что вы можете сделать что-то вроде этого, хотя:
require "openssl"
key = OpenSSL::PKey::RSA.generate(1024)
signature = key.sign(OpenSSL::Digest::SHA1.new, "data to sign")
Напоминание. Моя цель - создать самозаверяющий сертификат на тот случай, если мой давний вопрос потеряет фокус.
РЕДАКТИРОВАТЬ: я думаю, реальный вопрос заключается в том, как подписать сертификат с ключом