2010-03-04 18 views
7

मैं रूबी में एक स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न करने की कोशिश कर रहा हूं, लेकिन परेशानी में भाग रहा हूं। यह वही है मैं वर्तमान में अभी है:रूबी स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न करें

[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 

यह वही मेरी प्रमाण पत्र का कहना है है:

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

जब मैं उत्पन्न निजी कुंजी और अपाचे में प्रमाणपत्र का उपयोग करने का प्रयास करें, मैं इस त्रुटि मिलती है

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

यह अपने आप में एक सीएसआर, जो बातें मैं ऑनलाइन पाया है के सबसे कि apache2 त्रुटि के बारे में क्या कहते हैं (है कि मैं सीएसआर मिल गया है हो सकता है और CERT मिश्रित) है के बजाय एक प्रमाण पत्र कहता है। मेरा अनुमान है कि मैं सही प्रकार का प्रमाण पत्र नहीं बना रहा हूं। शायद मुझे सीरियल या संस्करण विशेषताओं को बदलना है। इसके अलावा, मैं कहीं भी स्वयं हस्ताक्षर नहीं कर रहा हूं, ऐसा नहीं कि मैं वैसे भी जानता हूं। मैं जानता हूँ कि आप इस हालांकि की तरह कुछ कर सकते हैं:

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

अनुस्मारक: मेरा लक्ष्य है, मेरे लंबे-ish सवाल रास्ते पर फोकस खो दिया एक स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न करने के लिए है के मामले में।

संपादित करें: मुझे लगता है कि असली सवाल यह है कि एक प्रमुख

+0

किसी भी एक है जो मैं सीएसआर exammple तैयार दिलचस्पी होगी रूबी में, आप इसे यहां पा सकते हैं: https://gist.github.com/1922961 – mtfk

उत्तर

2

साथ एक प्रमाण पत्र पर हस्ताक्षर मैं के बाद से उपयोग के उदाहरण के लिए कई बहुत अच्छा स्रोत मिल गया है करने के लिए है 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

मुझे अभी तक इसके लिए कोई अच्छा दस्तावेज नहीं मिला है, हालांकि मुझे नहीं लगता कि उदाहरणों में क्या लिखना बहुत लंबा लगेगा।

मैंने यह भी पता लगाया है कि मैं कठपुतली स्रोत कोड से क्या करना चाहता हूं। उम्मीद है कि यह किसी और की मदद करता है जो रूबी में ओपनएसएसएल के दस्तावेज़ीकरण की कमी पर निराश है।

+9

आह ... क्षणिक ना वेब का इलाज 2 साल से कम समय के बाद, सभी उपरोक्त लिंक टूटा हुआ है। –

+0

कठपुतली के स्रोत की संरचना भी बदल गई है, लेकिन उसी सामान्य जानकारी को उनके गिटहब रेपो से प्राप्त किया जा सकता है: https://github.com/puppetlabs/puppet/tree/master/lib/puppet/ssl –

1

विधि webrick/ssl में विधि है, जो समझने और उपयोगी समझने में आसान है।

+0

क्या आप कृपया एक प्रदान कर सकते हैं उपयोग उदाहरण? – Nabheet

+0

'प्रमाण, आरएसए = वेबब्रिक :: Utils.create_self_signed_cert 1024, [[" सीएन "," लोकलहोस्ट "]]," "' – puchu

4

मैंने इस कोड के लिए एक सहायक वर्ग बनाया है जिसे मैंने nickyp's gist से सीधे उठाया है जिसे मैंने Google खोज पर पाया था। केवल निर्भरता की जरूरत 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 

उपयोग:

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

आउटपुट:

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----- 
संबंधित मुद्दे