2010-03-04 12 views
7

Tôi đang cố gắng tạo chứng chỉ tự ký bằng ruby, nhưng đang gặp sự cố. Đây là những gì tôi đang có ngay bây giờ:Ruby Tạo Chứng chỉ Tự ký

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}") } 

Khi tôi cố gắng sử dụng khóa bí mật được tạo ra và chứng chỉ trong apache, tôi nhận được lỗi này:

[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 

Đây là những gì giấy chứng nhận của tôi nói:

-----BEGIN CERTIFICATE----- 
<lots of stuff> 
-----END CERTIFICATE----- 

Nó tự gọi nó là chứng chỉ thay vì CSR, đó là điều mà hầu hết những điều tôi đã tìm thấy trực tuyến nói về lỗi apache2 đó (tôi có thể đã nhận được CSR và CERT). Tôi đoán là tôi không tạo đúng loại chứng chỉ. Có lẽ tôi phải thay đổi các thuộc tính nối tiếp hoặc phiên bản. Ngoài ra, tôi không làm bất cứ việc tự ký nào ở bất cứ đâu, không phải là tôi biết. Tôi biết bạn có thể làm một cái gì đó như thế này mặc dù:

require "openssl" 
key = OpenSSL::PKey::RSA.generate(1024) 
signature = key.sign(OpenSSL::Digest::SHA1.new, "data to sign") 

Nhắc nhở: Mục tiêu của tôi là tạo chứng chỉ tự ký, trong trường hợp câu hỏi dài của tôi bị mất tập trung trên đường.

EDIT: Tôi đoán câu hỏi thực sự là làm thế nào để đăng ký một giấy chứng nhận với một chìa khóa

+0

Bất kỳ một người sẽ quan tâm tôi đã chuẩn bị exammple csr trong ruby, Bạn có thể tìm thấy nó ở đây: https://gist.github.com/1922961 – mtfk

Trả lời

2

Tôi đã kể từ khi tìm thấy một số nguồn rất tốt cho các ví dụ sử dụng OpenSSL:

http://snippets.dzone.com/posts/show/6309

http://projects.reductivelabs.com/projects/puppet/repository/revisions/master/entry/lib/puppet/sslcertificates.rb

http://projects.reductivelabs.com/projects/puppet/repository/revisions/master/entry/lib/puppet/sslcertificates/ca.rb

http://projects.reductivelabs.com/projects/puppet/repository/revisions/master/entry/lib/puppet/sslcertificates/certificate.rb

Tôi vẫn chưa tìm thấy bất kỳ tài liệu nào tốt cho điều này, mặc dù tôi không nghĩ rằng sẽ mất quá nhiều thời gian để ghi lại những gì trong ví dụ.

Tôi cũng đã tìm ra cách làm những gì tôi muốn từ mã nguồn con rối. Hy vọng điều này sẽ giúp người khác thất vọng vì thiếu tài liệu về OpenSSL trong ruby.

+9

Ah ... ture của web. Ít hơn 2 năm sau, tất cả các liên kết trên đều bị hỏng. –

+0

Cấu trúc nguồn của Puppet cũng đã thay đổi nhưng thông tin chung như vậy có thể được thu thập từ repo GitHub của họ: https://github.com/puppetlabs/puppet/tree/master/lib/puppet/ssl –

1

Có phương thức create_self_signed_cert trong webrick/ssl, dễ hiểu và hữu ích.

+0

bạn có thể vui lòng cung cấp ví dụ sử dụng? – Nabheet

+0

'cert, rsa = WEBrick :: Utils.create_self_signed_cert 1024, [[" CN "," localhost "]]," "' – puchu

4

Tôi đã tạo lớp trợ giúp cho mã này từ mã tôi đã trực tiếp từ số nickyp's gist mà tôi tìm thấy trên tìm kiếm của Google. Phụ thuộc duy nhất bạn cần là đá quý openssl (gem install openssl)

require 'openssl' 

class SelfSignedCertificate 
    def initialize 
    @key = OpenSSL::PKey::RSA.new(1024) 
    public_key = @key.public_key 

    subject = "/C=BE/O=Test/OU=Test/CN=Test" 

    @cert = OpenSSL::X509::Certificate.new 
    @cert.subject = @cert.issuer = OpenSSL::X509::Name.parse(subject) 
    @cert.not_before = Time.now 
    @cert.not_after = Time.now + 365 * 24 * 60 * 60 
    @cert.public_key = public_key 
    @cert.serial = 0x0 
    @cert.version = 2 

    ef = OpenSSL::X509::ExtensionFactory.new 
    ef.subject_certificate = @cert 
    ef.issuer_certificate = @cert 
    @cert.extensions = [ 
     ef.create_extension("basicConstraints","CA:TRUE", true), 
     ef.create_extension("subjectKeyIdentifier", "hash"), 
    # ef.create_extension("keyUsage", "cRLSign,keyCertSign", true), 
    ] 
    @cert.add_extension ef.create_extension("authorityKeyIdentifier", 
              "keyid:always,issuer:always") 

    @cert.sign @key, OpenSSL::Digest::SHA1.new 
    end 

    def self_signed_pem 
    @cert.to_pem 
    end 

    def private_key 
    @key 
    end 
end 

Cách sử dụng:

my_cert = SelfSignedCertificate.new 
puts "Private Key:\n#{my_cert.private_key}" 
puts "Self-signed PEM:\n#{my_cert.self_signed_pem}" 

Output:

Private Key: 
-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQDTtjPd3X9KX9BZpXKS82tM74Bs/hXsSLgnkitrc+oR4oF5PVko 
NZL3j51gkX3jJRSG9tNPQC5NVR+5h7tXPxU5TAQZl6MUiV+YWuRng98GeCjP3ePp 
meSStsKEMUiZI8YLVWrdbIjS+Q+lZnYMffeEOAoMSaei9hR4rOX0i+9hdwIDAQAB 
AoGBALdAc/6sFd0zuC2Qhu7p4kvS11AAUsuWWkhuPkUhLU9TxwxBbOXgEZlVZzzK 
UrQFSZJVHazweeOYNgCqmx82zE+cB4YzRLqkCPUD9t1bZcgk31tV39MSrC9CDKCB 
inUTMKflPbHL0B+Lq24S8KfuW9bOPofhspjlV7cZCX5adFiBAkEA7KOMkiQMyq9X 
ZVeRzJU0LmVdjrb7UBD5NebV+KaN8O7q+W4FG0nihcNj7xt2fZnvKM4FMfRwDP3G 
HRUfR0alQQJBAOUIjKXYyoUsk+tLASoYLX+uPocjd7YSB9UPK2lFxqHOzekAlynF 
u1JWEDPOjZNtNHmsQKOp5AWTUnm33JxfQLcCQByY5zQCB0m3RuiIXKZMobG5rkTA 
+D4EzxkkfFdASYcEWIEsOpHBrA5ePoV23Crxn2VfAGG5GJF5WafKFa2XbAECQFL/ 
5Ch+BfZ5DynnxoZAuMxakuJaYhmjMx9tHehKlw8waMKVqjJDK/1MnxaHNhtFKg0l 
9U7aVH4Iw4zEqrgodMUCQQCWZEUepSGoRVs1YDtag4FKSTMGXcnI/jllJmxHQhf4 
uiy/8Hb+FW49w3KO1zeq7WdXw7W7Q1uO94npYX5p535d 
-----END RSA PRIVATE KEY----- 
Signed PEM: 
-----BEGIN CERTIFICATE----- 
MIICgjCCAeugAwIBAgIBADANBgkqhkiG9w0BAQUFADA6MQswCQYDVQQGEwJCRTEN 
MAsGA1UECgwEVGVzdDENMAsGA1UECwwEVGVzdDENMAsGA1UEAwwEVGVzdDAeFw0x 
NDA4MjEwMTI1MTZaFw0xNTA4MjEwMTI1MTZaMDoxCzAJBgNVBAYTAkJFMQ0wCwYD 
VQQKDARUZXN0MQ0wCwYDVQQLDARUZXN0MQ0wCwYDVQQDDARUZXN0MIGfMA0GCSqG 
SIb3DQEBAQUAA4GNADCBiQKBgQDTtjPd3X9KX9BZpXKS82tM74Bs/hXsSLgnkitr 
c+oR4oF5PVkoNZL3j51gkX3jJRSG9tNPQC5NVR+5h7tXPxU5TAQZl6MUiV+YWuRn 
g98GeCjP3ePpmeSStsKEMUiZI8YLVWrdbIjS+Q+lZnYMffeEOAoMSaei9hR4rOX0 
i+9hdwIDAQABo4GXMIGUMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNNbdqck 
QT/B5hdQqimtW1Wnf+fmMGIGA1UdIwRbMFmAFNNbdqckQT/B5hdQqimtW1Wnf+fm 
oT6kPDA6MQswCQYDVQQGEwJCRTENMAsGA1UECgwEVGVzdDENMAsGA1UECwwEVGVz 
dDENMAsGA1UEAwwEVGVzdIIBADANBgkqhkiG9w0BAQUFAAOBgQB80KzzhkXCgJ0s 
1zXJXuocNDU5v0Z42ditNX9jS8pXuhHwcQbx7PVfOieO3GHC5YzzgMHGR3i2U2CQ 
rz9hP937ERxCfqpxhfMAD3Q+3rHsdGdNIauzzFb6XoXsM7koRnM27I6qvO3bamcz 
AVGH5eLic9IjZTQbZizFzNoR+H2N/g== 
-----END CERTIFICATE-----