acmesmith 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/docs/vendor/aws.md +16 -0
- data/lib/acmesmith/client.rb +18 -2
- data/lib/acmesmith/command.rb +29 -2
- data/lib/acmesmith/save_certificate_service.rb +64 -0
- data/lib/acmesmith/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bce001c8eca147fba2d1d2e0b43d30ebd175f096
|
4
|
+
data.tar.gz: 65fb44fdf5367fa3e6c66ecb837fd3119f07db76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a544bb8d9ee438806215471846bd71dd34fcd3dc0cdd38d15a130292d255c1f221492c1c129bcdb5906ac8afc5819b161296dd0b64607ad36149966f7cf23d7e
|
7
|
+
data.tar.gz: ecc46f9cc09ec3630d14a3052b43b51659fdaba8716e43095bc578326e7e5fc99174da54b26d80abc1579b8bb7c35e991e405a5238a38fd7c805ca985b9fa630
|
data/README.md
CHANGED
@@ -62,6 +62,14 @@ $ acmesmith save-pkcs12 COMMON_NAME --output=PATH # Save certificate and p
|
|
62
62
|
$ acmesmith autorenew [-d DAYS] # Renew certificates which being expired soon
|
63
63
|
```
|
64
64
|
|
65
|
+
```
|
66
|
+
# Save (or update) certificate files and key in a one command
|
67
|
+
$ acmesmith save COMMON_NAME \
|
68
|
+
--version-file=/tmp/cert.txt # Path to save a certificate version for following run
|
69
|
+
--key-file=/tmp/cert.key # Path to save a key
|
70
|
+
--fullchain-file=/tmp/cert.pem # Path to save a certficiate and its chain (concatenated)
|
71
|
+
```
|
72
|
+
|
65
73
|
See `acmesmith help [subcommand]` for more help.
|
66
74
|
|
67
75
|
## Configuration
|
data/docs/vendor/aws.md
CHANGED
@@ -103,4 +103,20 @@ Be sure to replace `{S3-REGION}` and `{YOUR-AWS-ACCOUNT-ID}` before applying it.
|
|
103
103
|
}
|
104
104
|
```
|
105
105
|
|
106
|
+
#### Policy for ACM post issuing hook
|
107
|
+
|
108
|
+
``` json
|
109
|
+
{
|
110
|
+
"Version": "2012-10-17",
|
111
|
+
"Statement": [
|
112
|
+
{
|
113
|
+
"Effect": "Allow",
|
114
|
+
"Action": ["acm:ImportCertificate", "acm:AddTagsToCertificate"],
|
115
|
+
"Resource": ["*"]
|
116
|
+
}
|
117
|
+
]
|
118
|
+
}
|
119
|
+
```
|
120
|
+
|
121
|
+
Optionally you can limit resource to certificate ARN(s).
|
106
122
|
|
data/lib/acmesmith/client.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'acmesmith/account_key'
|
2
2
|
require 'acmesmith/certificate'
|
3
3
|
|
4
|
+
require 'acmesmith/save_certificate_service'
|
5
|
+
|
4
6
|
require 'acme-client'
|
5
7
|
|
6
8
|
module Acmesmith
|
@@ -146,10 +148,17 @@ module Acmesmith
|
|
146
148
|
certs
|
147
149
|
end
|
148
150
|
|
149
|
-
def save_certificate(common_name, version: 'current', mode: '0600', output:)
|
151
|
+
def save_certificate(common_name, version: 'current', mode: '0600', output:, type: 'fullchain')
|
150
152
|
cert = storage.get_certificate(common_name, version: version)
|
151
153
|
File.open(output, 'w', mode.to_i(8)) do |f|
|
152
|
-
|
154
|
+
case type
|
155
|
+
when 'certificate'
|
156
|
+
f.puts cert.certificate.to_pem
|
157
|
+
when 'chain'
|
158
|
+
f.puts cert.chain
|
159
|
+
when 'fullchain'
|
160
|
+
f.puts cert.fullchain
|
161
|
+
end
|
153
162
|
end
|
154
163
|
end
|
155
164
|
|
@@ -178,6 +187,13 @@ module Acmesmith
|
|
178
187
|
end
|
179
188
|
end
|
180
189
|
|
190
|
+
def save(common_name, version: 'current', **kwargs)
|
191
|
+
cert = storage.get_certificate(common_name, version: version)
|
192
|
+
cert.key_passphrase = certificate_key_passphrase if certificate_key_passphrase
|
193
|
+
|
194
|
+
SaveCertificateService.new(cert, **kwargs).perform!
|
195
|
+
end
|
196
|
+
|
181
197
|
def autorenew(days: 7, common_names: nil)
|
182
198
|
(common_names || storage.list_certificates).each do |cn|
|
183
199
|
puts "=> #{cn}"
|
data/lib/acmesmith/command.rb
CHANGED
@@ -6,7 +6,7 @@ require 'acmesmith/client'
|
|
6
6
|
module Acmesmith
|
7
7
|
class Command < Thor
|
8
8
|
class_option :config, default: './acmesmith.yml', aliases: %w(-c)
|
9
|
-
class_option :passphrase_from_env, type: :boolean, aliases: %w(-E), default:
|
9
|
+
class_option :passphrase_from_env, type: :boolean, aliases: %w(-E), default: nil, desc: 'Read $ACMESMITH_ACCOUNT_KEY_PASSPHRASE and $ACMESMITH_CERTIFICATE_KEY_PASSPHRASE for passphrases'
|
10
10
|
|
11
11
|
desc "register CONTACT", "Create account key (contact e.g. mailto:xxx@example.org)"
|
12
12
|
def register(contact)
|
@@ -57,10 +57,11 @@ module Acmesmith
|
|
57
57
|
|
58
58
|
desc 'save-certificate COMMON_NAME', 'Save certificate to a file'
|
59
59
|
method_option :version, type: :string, default: 'current'
|
60
|
+
method_option :type, type: :string, enum: %w(certificate chain fullchain), default: 'fullchain'
|
60
61
|
method_option :output, type: :string, required: true, banner: 'PATH', desc: 'Path to output file'
|
61
62
|
method_option :mode, type: :string, default: '0600', desc: 'Mode (permission) of the output file on create'
|
62
63
|
def save_certificate(common_name)
|
63
|
-
client.save_certificate(common_name, version: options[:version], mode: options[:mode], output: options[:output])
|
64
|
+
client.save_certificate(common_name, version: options[:version], mode: options[:mode], output: options[:output], type: options[:type])
|
64
65
|
end
|
65
66
|
|
66
67
|
desc "show-private-key COMMON_NAME", "show private key"
|
@@ -78,6 +79,32 @@ module Acmesmith
|
|
78
79
|
client.save_private_key(common_name, version: options[:version], mode: options[:mode], output: options[:output])
|
79
80
|
end
|
80
81
|
|
82
|
+
desc 'save COMMON_NAME', 'Save (or update) certificate and key files.'
|
83
|
+
method_option :version, type: :string, default: 'current'
|
84
|
+
method_option :key_mode, type: :string, default: '0600', desc: 'Mode (permission) of the key file on create'
|
85
|
+
method_option :certificate_mode, type: :string, default: '0644', desc: 'Mode (permission) of the certificate files on create'
|
86
|
+
method_option :version_file, type: :string, required: false, banner: 'PATH', desc: 'Path to save a certificate version for following run (optional)'
|
87
|
+
method_option :key_file, type: :string, required: false, banner: 'PATH', desc: 'Path to save a key'
|
88
|
+
method_option :fullchain_file, type: :string, required: false , banner: 'PATH', desc: 'Path to save a certficiate and its chain (concatenated)'
|
89
|
+
method_option :chain_file, type: :string, required: false , banner: 'PATH', desc: 'Path to save a certificate chain (root and intermediate CA)'
|
90
|
+
method_option :certificate_file, type: :string, required: false, banner: 'PATH', desc: 'Path to save a certficiate'
|
91
|
+
method_option :atomic, type: :boolean, default: true, desc: 'Enable atomic file update with rename(2)'
|
92
|
+
def save(common_name)
|
93
|
+
client.save(
|
94
|
+
common_name,
|
95
|
+
version: options[:version],
|
96
|
+
key_mode: options[:key_mode],
|
97
|
+
certificate_mode: options[:certificate_mode],
|
98
|
+
version_file: options[:version_file],
|
99
|
+
key_file: options[:key_file],
|
100
|
+
fullchain_file: options[:fullchain_file],
|
101
|
+
chain_file: options[:chain_file],
|
102
|
+
certificate_file: options[:certificate_file],
|
103
|
+
atomic: options[:atomic],
|
104
|
+
verbose: true,
|
105
|
+
)
|
106
|
+
end
|
107
|
+
|
81
108
|
desc 'save-pkcs12 COMMON_NAME', 'Save ceriticate and private key to .p12 file'
|
82
109
|
method_option :version, type: :string, default: 'current'
|
83
110
|
method_option :output, type: :string, required: true, banner: 'PATH', desc: 'Path to output file'
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Acmesmith
|
2
|
+
class SaveCertificateService
|
3
|
+
def initialize(cert, key_mode: '0600', certificate_mode: '0644', version_file: nil, key_file: nil, fullchain_file: nil, chain_file: nil, certificate_file: nil, atomic: true, verbose: false)
|
4
|
+
@cert = cert
|
5
|
+
@key_mode = key_mode
|
6
|
+
@certificate_mode = certificate_mode
|
7
|
+
@version_file = version_file
|
8
|
+
@key_file = key_file
|
9
|
+
@fullchain_file = fullchain_file
|
10
|
+
@chain_file = chain_file
|
11
|
+
@certificate_file = certificate_file
|
12
|
+
@atomic = atomic
|
13
|
+
@verbose = verbose
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :cert
|
17
|
+
attr_reader :key_mode, :certificate_mode
|
18
|
+
attr_reader :version_file, :key_file, :fullchain_file, :chain_file, :certificate_file
|
19
|
+
def atomic?; !!@atomic; end
|
20
|
+
|
21
|
+
def perform!
|
22
|
+
if local_version == cert.version
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
log "Saving certificate CN=#{cert.common_name} (ver: #{cert.version})"
|
27
|
+
|
28
|
+
write_file(key_file, key_mode, cert.private_key)
|
29
|
+
write_file(certificate_file, certificate_mode, cert.certificate.to_pem)
|
30
|
+
write_file(chain_file, certificate_mode, cert.chain)
|
31
|
+
write_file(fullchain_file, certificate_mode, cert.fullchain)
|
32
|
+
write_file(version_file, certificate_mode, cert.version)
|
33
|
+
end
|
34
|
+
|
35
|
+
def local_version
|
36
|
+
@local_version ||= begin
|
37
|
+
if version_file && File.exist?(version_file)
|
38
|
+
File.read(version_file).chomp
|
39
|
+
else
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def log(*args)
|
48
|
+
if @verbose
|
49
|
+
puts *args
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_file(path, mode, body)
|
54
|
+
return unless path
|
55
|
+
realpath = atomic? ? "#{path}.new" : path
|
56
|
+
File.open(realpath, 'w', mode.to_i(8)) do |io|
|
57
|
+
io.puts body
|
58
|
+
end
|
59
|
+
if atomic?
|
60
|
+
File.rename realpath, path
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/acmesmith/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acmesmith
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sorah (Shota Fukumori)
|
@@ -133,6 +133,7 @@ files:
|
|
133
133
|
- lib/acmesmith/post_issuing_hooks/acm.rb
|
134
134
|
- lib/acmesmith/post_issuing_hooks/base.rb
|
135
135
|
- lib/acmesmith/post_issuing_hooks/shell.rb
|
136
|
+
- lib/acmesmith/save_certificate_service.rb
|
136
137
|
- lib/acmesmith/storages.rb
|
137
138
|
- lib/acmesmith/storages/base.rb
|
138
139
|
- lib/acmesmith/storages/filesystem.rb
|