acmesmith 0.7.0.beta1 → 0.8.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 +18 -1
- data/lib/acmesmith/client.rb +6 -8
- data/lib/acmesmith/config.rb +7 -8
- data/lib/acmesmith/post_issueing_hooks/acm.rb +65 -0
- data/lib/acmesmith/post_issueing_hooks/base.rb +10 -3
- data/lib/acmesmith/post_issueing_hooks/shell.rb +6 -11
- data/lib/acmesmith/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51baf45477f91b7ca8981c3e8da445348f44528f
|
4
|
+
data.tar.gz: 7ec32294fede6b7dd89e6f651e25dcb967d6a878
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2deb54d234db5b03fa4b989e84b31a199973896daae57d8da3353e829f0dec3c094332837bebaba2dc9f1597a36d6516aa7da009352d66170c4b045d50e26d86
|
7
|
+
data.tar.gz: 4764a56467552cf763878b1857ef5989a2162cbb3013a1e28aa7ed3f343e849bb02cb6470414dbfc6af0073b7dfb86172d98847237b6bcd9b4a9fb58cbc9e967
|
data/README.md
CHANGED
@@ -146,7 +146,9 @@ when a new certificate has been succesfully issued. The hooks are
|
|
146
146
|
sequentially executed in the same order as they are configured, and they
|
147
147
|
are configurable per certificate's common-name.
|
148
148
|
|
149
|
-
|
149
|
+
#### `shell`
|
150
|
+
|
151
|
+
Execute specified command on a shell. Environment variable `${COMMON_NAME}` is available.
|
150
152
|
|
151
153
|
```
|
152
154
|
post_issueing_hooks:
|
@@ -160,6 +162,21 @@ post_issueing_hooks:
|
|
160
162
|
command: /usr/bin/dosomethingelse ${COMMON_NAME}
|
161
163
|
```
|
162
164
|
|
165
|
+
### `acm`
|
166
|
+
|
167
|
+
Import certificate into AWS ACM.
|
168
|
+
|
169
|
+
```
|
170
|
+
post_issueing_hooks:
|
171
|
+
"test.example.com":
|
172
|
+
- acm:
|
173
|
+
region: us-east-1 # required
|
174
|
+
certificate_arn: arn:aws:acm:... # (optional)
|
175
|
+
```
|
176
|
+
|
177
|
+
When `certificate_arn` is not present, `acm` hook attempts to find the certificate ARN from existing certificate list. Certificate with same common name ("domain name" on ACM), and `Acmesmith` tag
|
178
|
+
will be used. Otherwise, `acm` hook imports as a new certificate with `Acmesmith` tag.
|
179
|
+
|
163
180
|
## 3rd party Plugins
|
164
181
|
|
165
182
|
### Challenge responders
|
data/lib/acmesmith/client.rb
CHANGED
@@ -98,17 +98,15 @@ module Acmesmith
|
|
98
98
|
cert = Certificate.from_acme_client_certificate(acme_cert)
|
99
99
|
storage.put_certificate(cert, certificate_key_passphrase)
|
100
100
|
|
101
|
-
execute_post_issue_hooks(
|
102
|
-
|
101
|
+
execute_post_issue_hooks(cert)
|
102
|
+
|
103
103
|
cert
|
104
104
|
end
|
105
105
|
|
106
|
-
def execute_post_issue_hooks(
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
hook.execute
|
111
|
-
end
|
106
|
+
def execute_post_issue_hooks(certificate)
|
107
|
+
hooks = config.post_issueing_hooks(certificate.common_name)
|
108
|
+
hooks.each do |hook|
|
109
|
+
hook.run(certificate: certificate)
|
112
110
|
end
|
113
111
|
end
|
114
112
|
|
data/lib/acmesmith/config.rb
CHANGED
@@ -52,16 +52,15 @@ module Acmesmith
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def post_issueing_hooks(common_name)
|
55
|
-
@post_issueing_hooks
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
specs_sub.map do |k, v|
|
61
|
-
PostIssueingHooks.find(k).new(**v.map{ |k_,v_| [k_.to_sym, v_]}.to_h)
|
62
|
-
end
|
55
|
+
if @config.key?('post_issueing_hooks') && @config['post_issueing_hooks'].key?(common_name)
|
56
|
+
specs = @config['post_issueing_hooks'][common_name]
|
57
|
+
specs.flat_map do |specs_sub|
|
58
|
+
specs_sub.map do |k, v|
|
59
|
+
PostIssueingHooks.find(k).new(**v.map{ |k_,v_| [k_.to_sym, v_]}.to_h)
|
63
60
|
end
|
64
61
|
end
|
62
|
+
else
|
63
|
+
[]
|
65
64
|
end
|
66
65
|
end
|
67
66
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
require 'acmesmith/post_issueing_hooks/base'
|
3
|
+
|
4
|
+
module Acmesmith
|
5
|
+
module PostIssueingHooks
|
6
|
+
class Acm < Base
|
7
|
+
def initialize(certificate_arn: nil, region:)
|
8
|
+
@certificate_arn = certificate_arn
|
9
|
+
@certificate_arn_set = true if @certificate_arn
|
10
|
+
@region = region
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :region
|
14
|
+
|
15
|
+
def certificate_arn
|
16
|
+
return @certificate_arn if @certificate_arn_set
|
17
|
+
@certificate_arn ||= find_certificate_arn
|
18
|
+
@certificate_arn_set = true
|
19
|
+
@certificate_arn
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_certificate_arn
|
23
|
+
acm.list_certificates().each do |page|
|
24
|
+
page.certificate_summary_list.each do |summary|
|
25
|
+
if summary.domain_name == common_name
|
26
|
+
tags = acm.list_tags_for_certificate(certificate_arn: summary.certificate_arn).tags
|
27
|
+
if tags.find{ |_| _.key == 'Acmesmith' }
|
28
|
+
return summary.certificate_arn
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def acm
|
36
|
+
@acm ||= Aws::ACM::Client.new(region: region)
|
37
|
+
end
|
38
|
+
|
39
|
+
def execute
|
40
|
+
puts "=> Importing certificate CN=#{common_name} into AWS ACM (region=#{region})"
|
41
|
+
if certificate_arn
|
42
|
+
puts " * updating ARN: #{certificate_arn}"
|
43
|
+
else
|
44
|
+
puts " * Importing as as new certificate"
|
45
|
+
end
|
46
|
+
|
47
|
+
resp = acm.import_certificate(
|
48
|
+
{
|
49
|
+
certificate: certificate.certificate.to_pem,
|
50
|
+
private_key: certificate.private_key.to_pem,
|
51
|
+
certificate_chain: certificate.chain,
|
52
|
+
}.merge(certificate_arn ? {certificate_arn: certificate_arn} : {})
|
53
|
+
)
|
54
|
+
unless certificate_arn
|
55
|
+
puts " * ARN: #{resp.certificate_arn}"
|
56
|
+
end
|
57
|
+
|
58
|
+
acm.add_tags_to_certificate(
|
59
|
+
certificate_arn: resp.certificate_arn,
|
60
|
+
tags: [key: 'Acmesmith', value: '1'],
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,13 +1,20 @@
|
|
1
1
|
module Acmesmith
|
2
2
|
module PostIssueingHooks
|
3
3
|
class Base
|
4
|
-
|
4
|
+
attr_reader :certificate
|
5
|
+
|
6
|
+
def common_name
|
7
|
+
certificate.common_name
|
5
8
|
end
|
6
9
|
|
7
|
-
def
|
8
|
-
|
10
|
+
def run(certificate:)
|
11
|
+
@certificate = certificate
|
12
|
+
execute
|
9
13
|
end
|
10
14
|
|
15
|
+
def execute
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
11
18
|
end
|
12
19
|
end
|
13
20
|
end
|
@@ -4,27 +4,22 @@ require 'acmesmith/post_issueing_hooks/base'
|
|
4
4
|
module Acmesmith
|
5
5
|
module PostIssueingHooks
|
6
6
|
class Shell < Base
|
7
|
-
|
8
|
-
class AmbiguousHostedZones < StandardError; end
|
9
|
-
|
10
|
-
def initialize(common_name:, command:, ignore_failure:false)
|
11
|
-
@common_name = common_name
|
7
|
+
def initialize(command:, ignore_failure: false)
|
12
8
|
@command = command
|
13
9
|
@ignore_failure = ignore_failure
|
14
10
|
end
|
15
11
|
|
16
12
|
def execute
|
17
|
-
puts "=> Executing Post Issueing Hook for #{
|
18
|
-
puts "
|
19
|
-
puts "=> Running: #{@command}"
|
13
|
+
puts "=> Executing Post Issueing Hook for #{common_name} in #{self.class.name}"
|
14
|
+
puts " $ #{@command}"
|
20
15
|
|
21
|
-
status = system({"COMMON_NAME" =>
|
16
|
+
status = system({"COMMON_NAME" => common_name}, @command)
|
22
17
|
|
23
18
|
unless status
|
24
19
|
if @ignore_failure
|
25
|
-
$stderr.puts "
|
20
|
+
$stderr.puts " ! execution failed"
|
26
21
|
else
|
27
|
-
raise "
|
22
|
+
raise "Execution failed"
|
28
23
|
end
|
29
24
|
end
|
30
25
|
end
|
data/lib/acmesmith/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acmesmith
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sorah (Shota Fukumori)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: acme-client
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/acmesmith/command.rb
|
129
129
|
- lib/acmesmith/config.rb
|
130
130
|
- lib/acmesmith/post_issueing_hooks.rb
|
131
|
+
- lib/acmesmith/post_issueing_hooks/acm.rb
|
131
132
|
- lib/acmesmith/post_issueing_hooks/base.rb
|
132
133
|
- lib/acmesmith/post_issueing_hooks/shell.rb
|
133
134
|
- lib/acmesmith/storages.rb
|
@@ -153,9 +154,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
154
|
version: '0'
|
154
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
156
|
requirements:
|
156
|
-
- - "
|
157
|
+
- - ">="
|
157
158
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
159
|
+
version: '0'
|
159
160
|
requirements: []
|
160
161
|
rubyforge_project:
|
161
162
|
rubygems_version: 2.6.11
|