puppetserver-ca 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9d9c6fbbbdd5256db4b75b2dc5f84d039c7d349
4
- data.tar.gz: 041f40524bf0eb4afd478dac9c508ac8ab904272
3
+ metadata.gz: 8ef4177b1921aaa80d30844823c81a28b3465c65
4
+ data.tar.gz: e7e494cf9f9f93127cf0b693afeba8cedfcb8659
5
5
  SHA512:
6
- metadata.gz: 3c7979c8a3e0148349e39a35cef01a75d2c71e0d7b193e1fa5a4647592c6c95f3a21565fcc2ca331e2a1664c2d2c12d3b13757fa99c35ef2fe8bfdb1b5ea60da
7
- data.tar.gz: d713bf41103d5debfa8ddffbaa13e28560b20dee9d429e5f46a6c72ab9ce794025b1e304b2d398f665300e5d6537fcb7f90b54e348edf12a75ab2b4b3af26407
6
+ metadata.gz: 95c956f2395ff96c6e6108d3fb67441052fb7de89581427cdeacee0de73415a46633b5dedc113fa56200e84963e6e3255f84fc58c8cd5676044171673e45f5b2
7
+ data.tar.gz: 66c067a3f40bc1d5c4c096bf5afb5eda563f8caebd431638a913f3ea26f797ecde05547a18864841755a779426d6003dc00f0d412940e53a643a08c21b0412b3
@@ -139,6 +139,8 @@ BANNER
139
139
 
140
140
  # Generate and save certs and associated keys
141
141
  if input['ca-client']
142
+ # Refused to generate certs offfline if the CA service is running
143
+ return 1 if check_server_online(puppet.settings)
142
144
  all_passed = generate_authorized_certs(certnames, alt_names, puppet.settings, signer.digest)
143
145
  else
144
146
  all_passed = generate_certs(certnames, alt_names, puppet.settings, signer.digest)
@@ -146,6 +148,31 @@ BANNER
146
148
  return all_passed ? 0 : 1
147
149
  end
148
150
 
151
+ # Queries the simple status endpoint for the status of the CA service.
152
+ # Returns true if it receives back a response of "running", and false if
153
+ # no connection can be made, or a different response is received.
154
+ def check_server_online(settings)
155
+ status_url = HttpClient::URL.new('https', settings[:server], settings[:masterport], 'status', 'v1', 'simple', 'ca')
156
+ begin
157
+ # Generating certs offline is necessary if the master cert has been destroyed
158
+ # or compromised. Since querying the status endpoint does not require a client cert, and
159
+ # we commonly won't have one, don't require one for creating the connection.
160
+ HttpClient.new(settings, with_client_cert: false).with_connection(status_url) do |conn|
161
+ result = conn.get
162
+ if result.body == "running"
163
+ @logger.err "CA service is running. Please stop it before attempting to generate certs offline."
164
+ true
165
+ else
166
+ false
167
+ end
168
+ end
169
+ true
170
+ rescue Errno::ECONNREFUSED => e
171
+ # Couldn't make a connection
172
+ false
173
+ end
174
+ end
175
+
149
176
  # Certs authorized to talk to the CA API need to be signed offline,
150
177
  # in order to securely add the special auth extension.
151
178
  def generate_authorized_certs(certnames, alt_names, settings, digest)
@@ -199,21 +226,38 @@ BANNER
199
226
 
200
227
  current_alt_names = process_alt_names(alt_names, certname)
201
228
 
202
- key, csr = generate_key_csr(certname, settings, digest, current_alt_names)
203
- next false unless csr
204
- next false unless ca.submit_certificate_request(certname, csr)
205
- next false unless ca.sign_certs([certname])
206
- if result = ca.get_certificate(certname)
207
- next false unless save_file(result.body, certname, settings[:certdir], "Certificate")
208
- next false unless save_keys(certname, settings, key)
229
+ next false unless submit_csr(certname, ca, settings, digest, current_alt_names)
230
+
231
+ # Check if the CA autosigned the cert
232
+ if download_cert(ca, certname, settings)
233
+ @logger.inform "Certificate for #{certname} was autosigned."
209
234
  true
210
235
  else
211
- false
236
+ next false unless ca.sign_certs([certname])
237
+ download_cert(ca, certname, settings)
212
238
  end
213
239
  end
214
240
  passed.all?
215
241
  end
216
242
 
243
+ def submit_csr(certname, ca, settings, digest, alt_names)
244
+ key, csr = generate_key_csr(certname, settings, digest, alt_names)
245
+ return false unless csr
246
+ # Always save the keys, since soemtimes the server saves the CSR
247
+ # even when it returns a 400 (e.g. when the CSR contains alt names
248
+ # but the server isn't configured to sign such certs)
249
+ return false unless save_keys(certname, settings, key)
250
+ return false unless ca.submit_certificate_request(certname, csr)
251
+ true
252
+ end
253
+
254
+ def download_cert(ca, certname, settings)
255
+ if result = ca.get_certificate(certname)
256
+ return false unless save_file(result.body, certname, settings[:certdir], "Certificate")
257
+ true
258
+ end
259
+ end
260
+
217
261
  # For certs signed offline, any alt names are added directly to the cert,
218
262
  # rather than to the CSR.
219
263
  def generate_key_csr(certname, settings, digest, alt_names = '')
@@ -41,7 +41,7 @@ module Puppetserver
41
41
  body: SIGN_BODY,
42
42
  type: :sign)
43
43
 
44
- results.all? {|result| result == :success }
44
+ results.all? { |result| result == :success }
45
45
  end
46
46
 
47
47
  def revoke_certs(certnames)
@@ -50,7 +50,7 @@ module Puppetserver
50
50
  body: REVOKE_BODY,
51
51
  type: :revoke)
52
52
 
53
- results.reduce {|prev, curr| worst_result(prev, curr) }
53
+ results.reduce { |prev, curr| worst_result(prev, curr) }
54
54
  end
55
55
 
56
56
  def submit_certificate_request(certname, csr)
@@ -60,7 +60,7 @@ module Puppetserver
60
60
  headers: {'Content-Type' => 'text/plain'},
61
61
  type: :submit)
62
62
 
63
- results.all? {|result| result == :success }
63
+ results.all? { |result| result == :success }
64
64
  end
65
65
 
66
66
  # Make an HTTP PUT request to CA
@@ -15,12 +15,20 @@ module Puppetserver
15
15
 
16
16
  attr_reader :store
17
17
 
18
- def initialize(settings)
18
+ # Not all connections require a client cert to be present.
19
+ # For example, when querying the status endpoint.
20
+ def initialize(settings, with_client_cert: true)
19
21
  @store = make_store(settings[:localcacert],
20
22
  settings[:certificate_revocation],
21
23
  settings[:hostcrl])
22
- @cert = load_cert(settings[:hostcert])
23
- @key = load_key(settings[:hostprivkey])
24
+
25
+ if with_client_cert
26
+ @cert = load_cert(settings[:hostcert])
27
+ @key = load_key(settings[:hostprivkey])
28
+ else
29
+ @cert = nil
30
+ @key = nil
31
+ end
24
32
  end
25
33
 
26
34
  def load_cert(cert_path)
@@ -126,4 +134,4 @@ module Puppetserver
126
134
  end
127
135
  end
128
136
  end
129
- end
137
+ end
@@ -1,5 +1,5 @@
1
1
  module Puppetserver
2
2
  module Ca
3
- VERSION = "1.1.1"
3
+ VERSION = "1.1.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppetserver-ca
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-26 00:00:00.000000000 Z
11
+ date: 2018-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: facter