Estoy tratando de generar un certificado autofirmado en ruby, pero estoy teniendo problemas. Esto es lo que actualmente tengo en este momento:Ruby Generar certificado autofirmado
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}") }
Cuando trato de utilizar la clave privada y un certificado generados en Apache, me sale este error:
[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
Esto es lo que dice mi certificado:
-----BEGIN CERTIFICATE-----
<lots of stuff>
-----END CERTIFICATE-----
Se llama a sí mismo un certificado en lugar de un CSR, que es lo que la mayoría de las cosas que he encontrado en línea dicen que el error sobre apache2 (que podría haber conseguido la RSE y el CERT mezclado). Supongo que no estoy generando el tipo correcto de certificado. Tal vez tengo que cambiar los atributos de serie o versión. Además, no estoy haciendo autofirma en ninguna parte, no es que yo sepa de todos modos. Sé que usted puede hacer algo como esto, sin embargo:
require "openssl"
key = OpenSSL::PKey::RSA.generate(1024)
signature = key.sign(OpenSSL::Digest::SHA1.new, "data to sign")
Recordatorio: Mi objetivo es generar un certificado autofirmado, en caso de que mi pregunta largo ish perdido el foco en el camino.
EDIT: supongo que la pregunta real es cómo firmar un certificado con una clave
Cualquiera que estará interesado preparé exammple RSE en ruby, puedes encontrarlo aquí: https://gist.github.com/1922961 – mtfk