quick_cert 2.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,3 @@
1
+ README.txt
2
+ History.txt
3
+ lib
@@ -0,0 +1,11 @@
1
+ === 2.0 / 2009-04-16
2
+
3
+ * 2 minor enhancements:
4
+ * Released as a gem
5
+ * Reorganized for Hoe
6
+
7
+ * 3 discoveries:
8
+ * CVS is odd after not using it for so long
9
+ * My ruby style hasn't changed much in the past five years
10
+ * I still don't know how OpenSSL works
11
+
@@ -0,0 +1,13 @@
1
+ .document
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ bin/quick_cert
7
+ lib/.document
8
+ lib/quick_cert.rb
9
+ lib/quick_cert/defaults.rb
10
+ sample/DRb_README.txt
11
+ sample/drbssl_c.rb
12
+ sample/drbssl_s.rb
13
+ sample/qc_config
@@ -0,0 +1,28 @@
1
+ = quick_cert
2
+
3
+ * http://seattlerb.rubyforge.org/quick_cert
4
+ * http://rubyforge.org/projects/seattlerb
5
+
6
+ == DESCRIPTION
7
+
8
+ quick_cert allows you to quickly and easily create SSL certificates. It uses
9
+ a simple configuration file to generate self-signed client and server
10
+ certificates.
11
+
12
+ == FEATURES/PROBLEMS
13
+
14
+ * I'm still not sure how it works nearly five years later
15
+ * My Ruby style from five years ago is largely unchanged
16
+
17
+ == SYNOPSIS
18
+
19
+ See QuickCert in the RDoc.
20
+
21
+ == REQUIREMENTS
22
+
23
+ * OpenSSL
24
+
25
+ == INSTALL
26
+
27
+ * sudo gem install quick_cert
28
+
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'hoe'
3
+ $: << 'lib'
4
+ require 'quick_cert'
5
+
6
+ Hoe.new 'quick_cert', QuickCert::VERSION do |qc|
7
+ qc.rubyforge_name = 'seattlerb'
8
+ qc.developer 'Eric Hodel', 'drbrain@segment7.net'
9
+ end
10
+
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require 'quick_cert'
4
+
5
+ # get configuration
6
+ CA = {}
7
+ CERTS = []
8
+ load ARGV.shift || 'qc_config'
9
+ require 'quick_cert/defaults'
10
+
11
+ qc = QuickCert.new CA, $DEBUG
12
+
13
+ CERTS.each do |cert_config|
14
+ qc.create_cert cert_config
15
+ end
16
+
@@ -0,0 +1 @@
1
+ quick_cert.rb
@@ -0,0 +1,332 @@
1
+ require 'openssl'
2
+
3
+ ##
4
+ # :main: README.txt
5
+ #
6
+ # QuickCert allows you to quickly and easily create SSL certificates. It uses
7
+ # a simple configuration file to generate self-signed client and server
8
+ # certificates.
9
+ #
10
+ # QuickCert is a compilation of NAKAMURA Hiroshi's post
11
+ # {[ruby-talk:89917]}[http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/89917]
12
+ #
13
+ # the example scripts referenced in the above post, and gen_csr.rb from Ruby's
14
+ # OpenSSL examples.
15
+ #
16
+ # A simple QuickCert configuration file looks like:
17
+ #
18
+ # full_hostname = `hostname`.strip
19
+ # domainname = full_hostname.split('.')[1..-1].join('.')
20
+ # hostname = full_hostname.split('.')[0]
21
+ #
22
+ # CA[:hostname] = hostname
23
+ # CA[:domainname] = domainname
24
+ # CA[:CA_dir] = File.join Dir.pwd, "CA"
25
+ # CA[:password] = '1234'
26
+ #
27
+ # CERTS << {
28
+ # :type => 'server',
29
+ # :hostname => 'uriel',
30
+ # :password => '5678',
31
+ # }
32
+ #
33
+ # CERTS << {
34
+ # :type => 'client',
35
+ # :user => 'drbrain',
36
+ # :email => 'drbrain@segment7.net',
37
+ # }
38
+ #
39
+ # This configuration will create a Certificate Authority in a 'CA' directory
40
+ # in the current directory, a server certificate with password '5678' for the
41
+ # server 'uriel' in a directory named 'uriel', and a client certificate for
42
+ # drbrain in the directory 'drbrain' with no password.
43
+ #
44
+ # There are additional SSL knobs you can tweak in the qc_defaults.rb file.
45
+ # (See `gem which quick_cert/defaults`).
46
+ #
47
+ # To generate the certificates, simply create a qc_config file where you want
48
+ # the certificate directories to be created, then run QuickCert.
49
+
50
+ class QuickCert
51
+
52
+ ##
53
+ # QuickCert Version
54
+
55
+ VERSION = "2.0"
56
+
57
+ ##
58
+ # Creates a new QuickCert instance using the Certificate Authority described
59
+ # in +ca_config+. If there is no CA at ca_config[:CA_dir], then QuickCert
60
+ # will initialize a new one. Prints out debugging info if +debug+ is true.
61
+
62
+ def initialize(ca_config, debug = false)
63
+ @ca_config = ca_config
64
+ @debug = debug
65
+
66
+ create_ca
67
+ end
68
+
69
+ ##
70
+ # Creates a new certificate from +cert_config+ that is signed
71
+ # by the CA.
72
+
73
+ def create_cert(cert_config)
74
+ cert_keypair = create_key cert_config
75
+ cert_csr = create_csr cert_config, cert_keypair
76
+ sign_cert cert_config, cert_keypair, cert_csr
77
+ end
78
+
79
+ ##
80
+ # Creates a new Certificate Authority from @ca_config if it
81
+ # does not already exist at ca_config[:CA_dir].
82
+
83
+ def create_ca
84
+ return if File.exist? @ca_config[:CA_dir]
85
+
86
+ Dir.mkdir @ca_config[:CA_dir]
87
+
88
+ Dir.mkdir File.join(@ca_config[:CA_dir], 'private'), 0700
89
+ Dir.mkdir File.join(@ca_config[:CA_dir], 'newcerts')
90
+ Dir.mkdir File.join(@ca_config[:CA_dir], 'crl')
91
+
92
+ open @ca_config[:serial_file], 'w' do |f| f << '1' end
93
+
94
+ warn "Generating CA keypair" if @debug
95
+ keypair = OpenSSL::PKey::RSA.new @ca_config[:ca_rsa_key_length]
96
+
97
+ cert = OpenSSL::X509::Certificate.new
98
+ name = @ca_config[:name].dup << ['CN', 'CA']
99
+ cert.subject = cert.issuer = OpenSSL::X509::Name.new(name)
100
+ cert.not_before = Time.now
101
+ cert.not_after = Time.now + @ca_config[:ca_cert_days] * 24 * 60 * 60
102
+ cert.public_key = keypair.public_key
103
+ cert.serial = 0x0
104
+ cert.version = 2 # X509v3
105
+
106
+ ef = OpenSSL::X509::ExtensionFactory.new
107
+ ef.subject_certificate = cert
108
+ ef.issuer_certificate = cert
109
+ cert.extensions = [
110
+ ef.create_extension("basicConstraints", "CA:TRUE", true),
111
+ ef.create_extension("nsComment", "Ruby/OpenSSL Generated Certificate"),
112
+ ef.create_extension("subjectKeyIdentifier", "hash"),
113
+ ef.create_extension("keyUsage", "cRLSign,keyCertSign", true),
114
+ ]
115
+ cert.add_extension ef.create_extension("authorityKeyIdentifier",
116
+ "keyid:always,issuer:always")
117
+ cert.sign keypair, OpenSSL::Digest::SHA1.new
118
+
119
+ keypair_export = keypair.export OpenSSL::Cipher::DES.new(:EDE3, :CBC),
120
+ @ca_config[:password]
121
+
122
+ warn "Writing keypair to #{@ca_config[:keypair_file]}" if @debug
123
+ open @ca_config[:keypair_file], "w", 0400 do |fp|
124
+ fp << keypair_export
125
+ end
126
+
127
+ warn "Writing cert to #{@ca_config[:cert_file]}" if @debug
128
+ open @ca_config[:cert_file], "w", 0644 do |f|
129
+ f << cert.to_pem
130
+ end
131
+
132
+ warn "Done generating certificate for #{cert.subject}" if @debug
133
+ end
134
+
135
+ ##
136
+ # Creates a new RSA key from +cert_config+.
137
+
138
+ def create_key(cert_config)
139
+ dest = cert_config[:hostname] || cert_config[:user]
140
+ keypair_file = File.join dest, (dest + "_keypair.pem")
141
+ Dir.mkdir dest, 0700
142
+
143
+ warn "Generating RSA keypair" if @debug
144
+ keypair = OpenSSL::PKey::RSA.new 1024
145
+
146
+ if cert_config[:password].nil? then
147
+ open keypair_file, "w", 0400 do |f|
148
+ f << keypair.to_pem
149
+ end
150
+ else
151
+ keypair_export = keypair.export OpenSSL::Cipher::DES.new(:EDE3, :CBC),
152
+ cert_config[:password]
153
+
154
+ warn "Writing keypair to #{keypair_file}" if @debug
155
+ open keypair_file, "w", 0400 do |f|
156
+ f << keypair_export
157
+ end
158
+
159
+ end
160
+
161
+ keypair_file
162
+ end
163
+
164
+ ##
165
+ # Creates a new Certificate Signing Request for the keypair in
166
+ # +keypair_file+, generating and saving new keypair if nil.
167
+
168
+ def create_csr(cert_config, keypair_file = nil)
169
+ keypair = nil
170
+ dest = cert_config[:hostname] || cert_config[:user]
171
+ csr_file = File.join dest, "csr_#{dest}.pem"
172
+
173
+ name = @ca_config[:name].dup
174
+
175
+ case cert_config[:type]
176
+ when 'server' then
177
+ name << ['OU', 'CA']
178
+ name << ['CN', cert_config[:hostname]]
179
+ when 'client' then
180
+ name << ['CN', cert_config[:user]]
181
+ name << ['emailAddress', cert_config[:email]]
182
+ end
183
+
184
+ name = OpenSSL::X509::Name.new name
185
+
186
+ if File.exist? keypair_file then
187
+ keypair = OpenSSL::PKey::RSA.new File.read(keypair_file),
188
+ cert_config[:password]
189
+ else
190
+ keypair = create_key cert_config
191
+ end
192
+
193
+ warn "Generating CSR for #{name}" if @debug
194
+
195
+ req = OpenSSL::X509::Request.new
196
+ req.version = 0
197
+ req.subject = name
198
+ req.public_key = keypair.public_key
199
+ req.sign keypair, OpenSSL::Digest::MD5.new
200
+
201
+ warn "Writing CSR to #{csr_file}" if @debug
202
+ open csr_file, "w" do |f|
203
+ f << req.to_pem
204
+ end
205
+
206
+ csr_file
207
+ end
208
+
209
+ ##
210
+ # Signs the certificate described in +cert_config+ and
211
+ # +csr_file+, saving it to +cert_file+.
212
+
213
+ def sign_cert(cert_config, cert_file, csr_file)
214
+ csr = OpenSSL::X509::Request.new File.read(csr_file)
215
+
216
+ raise "CSR sign verification failed." unless csr.verify csr.public_key
217
+
218
+ raise "Key length too short" if
219
+ csr.public_key.n.num_bits < @ca_config[:cert_key_length_min]
220
+
221
+ raise "Key length too long" if
222
+ csr.public_key.n.num_bits > @ca_config[:cert_key_length_max]
223
+
224
+ raise "DN does not match" if
225
+ csr.subject.to_a[0, @ca_config[:name].size] != @ca_config[:name]
226
+
227
+ # Only checks signature here. You must verify CSR according to your
228
+ # CP/CPS.
229
+
230
+ # CA setup
231
+
232
+ warn "Reading CA cert from #{@ca_config[:cert_file]}" if @debug
233
+ ca = OpenSSL::X509::Certificate.new File.read(@ca_config[:cert_file])
234
+
235
+ warn "Reading CA keypair from #{@ca_config[:keypair_file]}" if @debug
236
+ ca_keypair = OpenSSL::PKey::RSA.new File.read(@ca_config[:keypair_file]),
237
+ @ca_config[:password]
238
+
239
+ serial = File.read(@ca_config[:serial_file]).chomp.hex
240
+ open @ca_config[:serial_file], "w" do |f|
241
+ f << "%04X" % (serial + 1)
242
+ end
243
+
244
+ warn "Generating cert" if @debug
245
+
246
+ cert = OpenSSL::X509::Certificate.new
247
+ from = Time.now
248
+ cert.subject = csr.subject
249
+ cert.issuer = ca.subject
250
+ cert.not_before = from
251
+ cert.not_after = from + @ca_config[:cert_days] * 24 * 60 * 60
252
+ cert.public_key = csr.public_key
253
+ cert.serial = serial
254
+ cert.version = 2 # X509v3
255
+
256
+ basic_constraint = nil
257
+ key_usage = []
258
+ ext_key_usage = []
259
+
260
+ case cert_config[:type]
261
+ when "ca" then
262
+ basic_constraint = "CA:TRUE"
263
+ key_usage << "cRLSign" << "keyCertSign"
264
+ when "terminalsubca" then
265
+ basic_constraint = "CA:TRUE,pathlen:0"
266
+ key_usage << "cRLSign" << "keyCertSign"
267
+ when "server" then
268
+ basic_constraint = "CA:FALSE"
269
+ key_usage << "digitalSignature" << "keyEncipherment"
270
+ ext_key_usage << "serverAuth"
271
+ when "ocsp" then
272
+ basic_constraint = "CA:FALSE"
273
+ key_usage << "nonRepudiation" << "digitalSignature"
274
+ ext_key_usage << "serverAuth" << "OCSPSigning"
275
+ when "client" then
276
+ basic_constraint = "CA:FALSE"
277
+ key_usage << "nonRepudiation" << "digitalSignature" << "keyEncipherment"
278
+ ext_key_usage << "clientAuth" << "emailProtection"
279
+ else
280
+ raise "unknonw cert type \"#{cert_config[:type]}\""
281
+ end
282
+
283
+ ef = OpenSSL::X509::ExtensionFactory.new
284
+ ef.subject_certificate = cert
285
+ ef.issuer_certificate = ca
286
+ ex = []
287
+ ex << ef.create_extension("basicConstraints", basic_constraint, true)
288
+ ex << ef.create_extension("nsComment",
289
+ "Ruby/OpenSSL Generated Certificate")
290
+ ex << ef.create_extension("subjectKeyIdentifier", "hash")
291
+ #ex << ef.create_extension("nsCertType", "client, email")
292
+ unless key_usage.empty? then
293
+ ex << ef.create_extension("keyUsage", key_usage.join(","))
294
+ end
295
+ #ex << ef.create_extension("authorityKeyIdentifier",
296
+ # "keyid:always,issuer:always")
297
+ #ex << ef.create_extension("authorityKeyIdentifier", "keyid:always")
298
+ unless ext_key_usage.empty? then
299
+ ex << ef.create_extension("extendedKeyUsage", ext_key_usage.join(","))
300
+ end
301
+
302
+ if @ca_config[:cdp_location] then
303
+ ex << ef.create_extension("crlDistributionPoints",
304
+ @ca_config[:cdp_location])
305
+ end
306
+
307
+ if @ca_config[:ocsp_location] then
308
+ ex << ef.create_extension("authorityInfoAccess",
309
+ "OCSP;" << @ca_config[:ocsp_location])
310
+ end
311
+ cert.extensions = ex
312
+ cert.sign ca_keypair, OpenSSL::Digest::SHA1.new
313
+
314
+ backup_cert_file = @ca_config[:new_certs_dir] + "/cert_#{cert.serial}.pem"
315
+ warn "Writing backup cert to #{backup_cert_file}" if @debug
316
+ open backup_cert_file, "w", 0644 do |f|
317
+ f << cert.to_pem
318
+ end
319
+
320
+ # Write cert
321
+ dest = cert_config[:hostname] || cert_config[:user]
322
+ cert_file = File.join dest, "cert_#{dest}.pem"
323
+ warn "Writing cert to #{cert_file}" if @debug
324
+ open cert_file, "w", 0644 do |f|
325
+ f << cert.to_pem
326
+ end
327
+
328
+ cert_file
329
+ end
330
+
331
+ end
332
+
@@ -0,0 +1,28 @@
1
+ CA[:CA_dir] ||= Dir.pwd
2
+
3
+ CA[:keypair_file] ||= File.join CA[:CA_dir], "private/cakeypair.pem"
4
+ CA[:cert_file] ||= File.join CA[:CA_dir], "cacert.pem"
5
+ CA[:serial_file] ||= File.join CA[:CA_dir], "serial"
6
+ CA[:new_certs_dir] ||= File.join CA[:CA_dir], "newcerts"
7
+ CA[:new_keypair_dir] ||= File.join CA[:CA_dir], "private/keypair_backup"
8
+ CA[:crl_dir] ||= File.join CA[:CA_dir], "crl"
9
+
10
+ CA[:ca_cert_days] ||= 5 * 365 # five years
11
+ CA[:ca_rsa_key_length] ||= 2048
12
+
13
+ CA[:cert_days] ||= 365 # one year
14
+ CA[:cert_key_length_min] ||= 1024
15
+ CA[:cert_key_length_max] ||= 2048
16
+
17
+ CA[:crl_file] ||= File.join CA[:crl_dir], "#{CA[:hostname]}.crl"
18
+ CA[:crl_pem_file] ||= File.join CA[:crl_dir], "#{CA[:hostname]}.pem"
19
+ CA[:crl_days] ||= 14
20
+
21
+ if CA[:name].nil?
22
+ CA[:name] = [
23
+ ['C', 'US', OpenSSL::ASN1::PRINTABLESTRING],
24
+ ['O', CA[:domainname], OpenSSL::ASN1::UTF8STRING],
25
+ ['OU', CA[:hostname], OpenSSL::ASN1::UTF8STRING],
26
+ ]
27
+ end
28
+
@@ -0,0 +1,57 @@
1
+ Here's a quick primer on how to get use DRb over SSL with QuickCert.
2
+
3
+ 1. Modify qc_config to suit. The host I'm writing this on is named 'uriel',
4
+ and my email address is 'drbrain@segment7.net', so I filled in the proper
5
+ entries in the server and client certs.
6
+
7
+ full_hostname = `hostname`.strip
8
+ domainname = full_hostname.split('.')[1..-1].join('.')
9
+ hostname = full_hostname.split('.')[0]
10
+
11
+ CA[:hostname] = hostname
12
+ CA[:domainname] = domainname
13
+ CA[:CA_dir] = File.join Dir.pwd, "CA"
14
+ CA[:password] = '1234'
15
+
16
+ CERTS << {
17
+ :type => 'server',
18
+ :hostname => 'uriel',
19
+ :password => '5678',
20
+ }
21
+
22
+ CERTS << {
23
+ :type => 'client',
24
+ :user => 'drbrain',
25
+ :email => 'drbrain@segment7.net',
26
+ }
27
+
28
+ 2. Generate the certificates
29
+
30
+ quick_cert
31
+
32
+ 3. Setup the DRb server to use the proper certificates. They are already
33
+ setup for 'uriel', so you'll have to edit drbssl_s.rb to match your
34
+ configuration.
35
+
36
+ cd uriel
37
+ ln -s ../drbssl_s.rb
38
+ ln -s ../CA/cacert.pem
39
+ vi drbssl_s.rb
40
+
41
+ 4. Start the DRb server. You'll need the server certificate's passphrase.
42
+
43
+ ruby drbssl_s.rb
44
+
45
+ 5. Setup the DRb client to use the proper certificates. They are already
46
+ setup for 'drbrain@segment7.net', so you'll have to edit drbssl_c.rb to
47
+ match your configuration.
48
+
49
+ cd drbrain
50
+ ln -s ../drbssl_c.rb
51
+ ln -s ../CA/cacert.pem
52
+ vi drbssl_c.rb
53
+
54
+ 6. Start the DRb client. Then type your name and hit enter. You will get
55
+ back a message "Hello, <your name>"
56
+
57
+ ./drbssl_c.rb
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'drb'
4
+ require 'drb/ssl'
5
+
6
+ send_cert = true
7
+ there = ARGV.shift || "drbssl://localhost:3456"
8
+
9
+ config = Hash.new
10
+ config[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER
11
+ config[:SSLCACertificateFile] = "CA/cacert.pem"
12
+ config[:SSLVerifyCallback] = lambda { |ok, store|
13
+ p :SSLVerifyCallback_args => [ok, store.error_string]
14
+ ok
15
+ }
16
+
17
+ if send_cert then
18
+ config[:SSLPrivateKey] = OpenSSL::PKey::RSA.new File.read("user/user_keypair.pem")
19
+ config[:SSLCertificate] = OpenSSL::X509::Certificate.new File.read("user/cert_user.pem")
20
+ end
21
+
22
+ DRb.start_service(nil,nil,config)
23
+ h = DRbObject.new(nil, there)
24
+
25
+ loop do
26
+ print "ok, say your name: "
27
+ $stdout.flush
28
+ line = gets.chomp
29
+ p h.hello(line)
30
+ end
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'drb'
4
+ require 'drb/ssl'
5
+
6
+ require_client_cert = true
7
+ here = ARGV.shift || "drbssl://localhost:3456"
8
+
9
+ class HelloWorld
10
+ include DRbUndumped
11
+
12
+ def hello(name)
13
+ "Hello, #{name}, from an SSL-encrypted server!"
14
+ end
15
+ end
16
+
17
+ puts "PSSST! Password is 5678"
18
+
19
+ config = Hash.new
20
+ config[:verbose] = true
21
+ config[:SSLPrivateKey] = OpenSSL::PKey::RSA.new File.read("host/host_keypair.pem")
22
+ config[:SSLCertificate] =
23
+ OpenSSL::X509::Certificate.new File.read("host/cert_host.pem")
24
+
25
+ if require_client_cert then
26
+ config[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER |
27
+ OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
28
+ config[:SSLCACertificateFile] = "CA/cacert.pem"
29
+ config[:SSLVerifyCallback] = proc do |ok, store|
30
+ p :SSLVerifyCallback_args => [ok, store.error_string]
31
+ ok
32
+ end
33
+ end
34
+
35
+ DRb.start_service(here, HelloWorld.new, config)
36
+ puts DRb.uri
37
+ DRb.thread.join
@@ -0,0 +1,17 @@
1
+ CA[:hostname] = 'host'
2
+ CA[:domainname] = 'host.example.com'
3
+ CA[:CA_dir] = File.join Dir.pwd, "CA"
4
+ CA[:password] = '1234'
5
+
6
+ CERTS << {
7
+ :type => 'server',
8
+ :hostname => 'host',
9
+ :password => '5678',
10
+ }
11
+
12
+ CERTS << {
13
+ :type => 'client',
14
+ :user => 'user',
15
+ :email => 'user@example.com',
16
+ }
17
+
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: quick_cert
3
+ version: !ruby/object:Gem::Version
4
+ version: "2.0"
5
+ platform: ruby
6
+ authors:
7
+ - Eric Hodel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
14
+ YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
15
+ ZXQwHhcNMDcxMjIxMDIwNDE0WhcNMDgxMjIwMDIwNDE0WjBBMRAwDgYDVQQDDAdk
16
+ cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
17
+ FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
18
+ LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
19
+ U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
20
+ Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
21
+ mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
22
+ g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
23
+ sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
24
+ BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQUFAAOCAQEAHagT4lfX
25
+ kP/hDaiwGct7XPuVGbrOsKRVD59FF5kETBxEc9UQ1clKWngf8JoVuEoKD774dW19
26
+ bU0GOVWO+J6FMmT/Cp7nuFJ79egMf/gy4gfUfQMuvfcr6DvZUPIs9P/TlK59iMYF
27
+ DIOQ3DxdF3rMzztNUCizN4taVscEsjCcgW6WkUJnGdqlu3OHWpQxZBJkBTjPCoc6
28
+ UW6on70SFPmAy/5Cq0OJNGEWBfgD9q7rrs/X8GGwUWqXb85RXnUVi/P8Up75E0ag
29
+ 14jEc90kN+C7oI/AGCBN0j6JnEtYIEJZibjjDJTSMWlUKKkj30kq7hlUC2CepJ4v
30
+ x52qPcexcYZR7w==
31
+ -----END CERTIFICATE-----
32
+
33
+ date: 2009-04-16 00:00:00 -07:00
34
+ default_executable:
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: hoe
38
+ type: :development
39
+ version_requirement:
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 1.12.1
45
+ version:
46
+ description: |-
47
+ quick_cert allows you to quickly and easily create SSL certificates. It uses
48
+ a simple configuration file to generate self-signed client and server
49
+ certificates.
50
+ email:
51
+ - drbrain@segment7.net
52
+ executables:
53
+ - quick_cert
54
+ extensions: []
55
+
56
+ extra_rdoc_files:
57
+ - History.txt
58
+ - Manifest.txt
59
+ - README.txt
60
+ - sample/DRb_README.txt
61
+ files:
62
+ - .document
63
+ - History.txt
64
+ - Manifest.txt
65
+ - README.txt
66
+ - Rakefile
67
+ - bin/quick_cert
68
+ - lib/.document
69
+ - lib/quick_cert.rb
70
+ - lib/quick_cert/defaults.rb
71
+ - sample/DRb_README.txt
72
+ - sample/drbssl_c.rb
73
+ - sample/drbssl_s.rb
74
+ - sample/qc_config
75
+ has_rdoc: true
76
+ homepage: http://seattlerb.rubyforge.org/quick_cert
77
+ licenses: []
78
+
79
+ post_install_message:
80
+ rdoc_options:
81
+ - --main
82
+ - README.txt
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ version:
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: "0"
96
+ version:
97
+ requirements: []
98
+
99
+ rubyforge_project: seattlerb
100
+ rubygems_version: 1.3.2
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: quick_cert allows you to quickly and easily create SSL certificates
104
+ test_files: []
105
+
Binary file