chef-vault-pki 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +8 -8
  2. data/bin/chef-vault-pki +34 -30
  3. data/lib/chef-vault-pki.rb +112 -0
  4. metadata +6 -5
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTNjZmU0Mzc0ZWZhYjdkNTgwMjlhODNhYjlkOTc5M2JjYWY0ZmY0MA==
4
+ MWIwYmEwMGNiYzY3NmY4NjFlNmFjMTE5ODY2ZTdjNmRhNTI0MTAzNA==
5
5
  data.tar.gz: !binary |-
6
- ZWUwODczNDcxNzgyYzg5MjM5ZjlkOWVkNjExZjRmYzVjMzY3ZGUxZg==
6
+ MzIyYTUzNDIxNWYxNzcwZTA1YjlhZDhmZTg4NWM2YTFjN2ViYWRiZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODA5NTVmYTgyOWRkZGRiNWQxZDhhNzRiYWNhOGM0YjZlMzE3YzczNTc3MDk0
10
- ZTc3YTI1ZDViZTIyNTM5NzQwYzY2MjNjYzhhMzNiMTRhNTkxMWM2OTk2NTg5
11
- MTMxNmM5ZGU5OGRkM2UxMGI5YjQ3OTNlZTM4NTliYTg1NGFhNjc=
9
+ MzExZjA1YzA0MGY1N2U2Y2IxYWQ1OTc2M2QyZDU3NDBjY2FmMzlkODIzYjcy
10
+ ZGJhYWI3ZTk3ZGFmMzdmMTNhNWIxNjg2NWI5NmYwZTA5ODUxZWFmMTIwMThm
11
+ MDY1MTM2MTIzZWU3N2JmNDIxM2JmZWY5ZDgwZjY5YTQzZjQ2NDg=
12
12
  data.tar.gz: !binary |-
13
- NjI4OWQ2OTJiNzllYzI2NzJhZDhkMGJjZmMyZWY4OGMwYTQ5MzcwN2IwZTU4
14
- NDI4YjkwZGYxNzRiNmEwY2Y2ZjExNmNmZmQ1YjA4YjBhY2U5MjVlYWZiNWQx
15
- YzRjYWE0MDdmNzlmNzhlMjJjMWNkMWMzNjY2ZTk3ZDc5ZTUwN2E=
13
+ MjVhZjNjMjFjZGNlZTY3MDQ0NDQ0MDgwNzJhMjdmMzY0NWU1NWIyZGQ3NTVh
14
+ ODQ0YThiODJjY2NmYzM1ZTkzMzFkZjdiMzM2MzYxNGIwMjhjYzIyNzdhYzJh
15
+ ZDBhNGUzZDA3NjQzN2NlODBjOTUyN2ZhYzE5ZDQ3MTc4MTI0NDA=
data/bin/chef-vault-pki CHANGED
@@ -1,23 +1,36 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'openssl'
3
+ require 'chef-vault-pki'
4
4
  require 'base64'
5
5
  require 'optparse'
6
+ require 'json'
6
7
 
7
- version = '0.1.0'
8
+ version = '0.2.0'
8
9
  options = {
10
+ :key_size => 2048,
9
11
  :name => "chef_vault_pki_ca",
10
- :expire => 3655,
12
+ :expires => 365,
11
13
  :output => 'json'
12
14
  }
13
15
 
16
+
14
17
  OptionParser.new do |opts|
15
- opts.banner = "Usage chef-vault-pki [options]"
18
+ opts.banner = "Usage chef-vault-pki [command] [options]"
19
+ opts.separator ""
20
+ opts.separator "Commands:"
21
+ opts.separator " ca - Creates a CA (default)"
22
+ opts.separator " client - Creates a client (CA must be provided on STDIN as JSON)"
23
+ opts.separator ""
24
+ opts.separator "Common options:"
16
25
 
17
26
  opts.on("-n", "--name NAME", "NAME for SSL certificate. Defaults to #{options[:name]}") do |n|
18
27
  options[:name] = n
19
28
  end
20
29
 
30
+ opts.on("-k", "--key_size KEY_SIZE", "Use KEY_SIZE bits for the key. Defaults to #{options[:key_size]}") do |n|
31
+ options[:name] = n
32
+ end
33
+
21
34
  opts.on("-e", "--expires DAYS", "Certificate expires in DAYS days. Defaults to #{options[:expire]}") do |e|
22
35
  options[:expire] = e
23
36
  end
@@ -38,35 +51,26 @@ OptionParser.new do |opts|
38
51
 
39
52
  end.parse!
40
53
 
41
- key = OpenSSL::PKey::RSA.new 2048
42
-
43
- name = OpenSSL::X509::Name.parse "CN=#{options[:name]}"
44
-
45
- expires = Time.now + (options[:expire] * 3600 * 24)
46
-
47
- cert = OpenSSL::X509::Certificate.new
48
- cert.version = 3
49
- cert.serial = 0
50
- cert.not_before = Time.now
51
- cert.not_after = expires
52
- cert.public_key = key.public_key
53
- cert.subject = name
54
- cert.issuer = name
55
- #cert.sign key, OpenSSL::Digest::SHA1.new
56
- extension_factory = OpenSSL::X509::ExtensionFactory.new
57
- extension_factory.subject_certificate = cert
58
- extension_factory.issuer_certificate = cert
59
- extension_factory.create_extension 'subjectKeyIdentifier', 'hash'
60
- extension_factory.create_extension 'basicConstraints', 'CA:TRUE', true
61
- extension_factory.create_extension 'keyUsage', 'cRLSign,keyCertSign', true
62
- cert.sign key, OpenSSL::Digest::SHA1.new
54
+ command = ARGV.shift || 'ca'
55
+
56
+ case command
57
+ when 'ca'
58
+ pki = ChefVaultPKI::CA.new options
59
+ pki.generate!
60
+ when 'client'
61
+ ca_pems = JSON.parse(STDIN.read)
62
+ ca = ChefVaultPKI::CA.new
63
+ ca.load! ca_pems
64
+
65
+ pki = ChefVaultPKI::Client.new options
66
+ pki.generate! ca
67
+ end
63
68
 
64
69
  case options[:output].downcase
65
70
  when 'json'
66
- require 'json'
67
- puts ({ :cert => cert.to_pem, :key => key.to_pem }.to_json)
71
+ puts ({ :cert => pki.cert.to_pem, :key => pki.key.to_pem }.to_json)
68
72
  else
69
- puts cert.to_pem
70
- puts key.to_pem
73
+ puts pki.cert.to_pem
74
+ puts pki.key.to_pem
71
75
  end
72
76
 
@@ -0,0 +1,112 @@
1
+ require 'openssl'
2
+
3
+ module ChefVaultPKI
4
+
5
+ class CA
6
+ attr_accessor :key, :cert
7
+
8
+ def initialize(args = {})
9
+ @config = {
10
+ :key_size => 2048,
11
+ :expires => 10,
12
+ :expires_factor => 60 * 60 * 24,
13
+ :name => 'chef_vault_pki_ca'
14
+ }
15
+ @config.keys.each do |key|
16
+ if args.has_key? key
17
+ @config[key] = args[key]
18
+ end
19
+ end
20
+ self
21
+ end
22
+
23
+ def generate!
24
+ name = OpenSSL::X509::Name.parse "CN=#{@config[:name]}"
25
+ not_before = Time.now
26
+ not_after = not_before + (@config[:expires] * @config[:expires_factor])
27
+
28
+ @key = OpenSSL::PKey::RSA.new @config[:key_size]
29
+
30
+ @cert = OpenSSL::X509::Certificate.new
31
+ @cert.version = 3
32
+ @cert.serial = 0
33
+ @cert.not_before = not_before
34
+ @cert.not_after = not_after
35
+ @cert.public_key = key.public_key
36
+ @cert.subject = name
37
+ @cert.issuer = name
38
+ #cert.sign key, OpenSSL::Digest::SHA1.new
39
+ extension_factory = OpenSSL::X509::ExtensionFactory.new
40
+ extension_factory.subject_certificate = @cert
41
+ extension_factory.issuer_certificate = @cert
42
+ extension_factory.create_extension 'subjectKeyIdentifier', 'hash'
43
+ extension_factory.create_extension 'basicConstraints', 'CA:TRUE', true
44
+ extension_factory.create_extension 'keyUsage', 'cRLSign,keyCertSign', true
45
+ @cert.sign @key, OpenSSL::Digest::SHA1.new
46
+ end
47
+
48
+ def load!(hash)
49
+ @key = OpenSSL::PKey::RSA.new hash['key']
50
+ @cert = OpenSSL::X509::Certificate.new hash['cert']
51
+ end
52
+
53
+ end
54
+
55
+ class Client
56
+ attr_accessor :key, :csr, :cert
57
+
58
+ def initialize(args = {})
59
+ @config = {
60
+ :key_size => 2048,
61
+ :expires => 10,
62
+ :expires_factor => 60 * 60 * 24,
63
+ :name => 'chef_vault_pki_client'
64
+ }
65
+ @config.keys.each do |key|
66
+ if args.has_key? key
67
+ @config[key] = args[key]
68
+ end
69
+ end
70
+ end
71
+
72
+ def generate!(ca)
73
+ name = OpenSSL::X509::Name.parse "CN=#{@config[:name]}"
74
+ not_before = Time.now
75
+ not_after = not_before + (@config[:expires] * @config[:expires_factor])
76
+
77
+ @key = OpenSSL::PKey::RSA.new @config[:key_size]
78
+
79
+ @csr = OpenSSL::X509::Request.new
80
+ @csr.version = 0
81
+ @csr.subject = name
82
+ @csr.public_key = @key.public_key
83
+ @csr.sign @key, OpenSSL::Digest::SHA1.new
84
+
85
+ @cert = OpenSSL::X509::Certificate.new
86
+ @cert.serial = 0
87
+ @cert.version = 2
88
+ @cert.not_before = not_before
89
+ @cert.not_after = not_after
90
+
91
+ @cert.subject = @csr.subject
92
+ @cert.public_key = @csr.public_key
93
+ @cert.issuer = ca.cert.subject
94
+
95
+ extension_factory = OpenSSL::X509::ExtensionFactory.new
96
+ extension_factory.subject_certificate = @cert
97
+ extension_factory.issuer_certificate = ca.cert
98
+ extension_factory.create_extension 'basicConstraints', 'CA:FALSE'
99
+ extension_factory.create_extension 'keyUsage', 'keyEncipherment,dataEncipherment,digitalSignature'
100
+ extension_factory.create_extension 'subjectKeyIdentifier', 'hash'
101
+
102
+ @cert.sign ca.key, OpenSSL::Digest::SHA1.new
103
+ end
104
+
105
+ def load!(hash)
106
+ @key = OpenSSL::PKey::RSA.new hash['key']
107
+ @cert = OpenSSL::X509::Certificate.new hash['cert']
108
+ end
109
+
110
+ end
111
+
112
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-vault-pki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Fraser Scott
7
+ - zeroXten
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-21 00:00:00.000000000 Z
11
+ date: 2014-03-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Generate a CA for chef_vault_pki cookbook
13
+ description: Tool for chef_vault_pki cookbook
14
14
  email: fraser.scott@gmail.com
15
15
  executables:
16
16
  - chef-vault-pki
@@ -18,6 +18,7 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - bin/chef-vault-pki
21
+ - lib/chef-vault-pki.rb
21
22
  homepage: https://github.com/zeroXten/chef-vault-pki
22
23
  licenses:
23
24
  - MIT
@@ -41,5 +42,5 @@ rubyforge_project:
41
42
  rubygems_version: 2.2.1
42
43
  signing_key:
43
44
  specification_version: 4
44
- summary: Generate a CA for chef_vault_pki cookbook
45
+ summary: Tool for chef_vault_pki cookbook
45
46
  test_files: []