Skip to content

Commit 366cc38

Browse files
committed
Add a renew subcommand to puppet ssl
1 parent 632fc7e commit 366cc38

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

lib/puppet/application/ssl.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ def help
5454
Puppet setting, it can be specified as a time interval, such as 30s,
5555
5m, 1h.
5656
57+
* renew
58+
Renew existing and non-expired client certificate.
59+
5760
* submit_request:
5861
Generate a certificate signing request (CSR) and submit it to the CA. If
5962
a private and public key pair already exist, they will be used to generate
@@ -150,6 +153,8 @@ def main
150153
end
151154
when 'generate_request'
152155
generate_request(certname)
156+
when 'renew'
157+
renew_certificate(certname)
153158
when 'verify'
154159
verify(certname)
155160
when 'clean'
@@ -248,6 +253,26 @@ def download_cert(ssl_context)
248253
raise Puppet::Error.new(_("Failed to download certificate: %{message}") % { message: e.message }, e)
249254
end
250255

256+
def renew_certificate(certname)
257+
ssl_context = @ssl_provider.load_context(certname: certname)
258+
route = create_route(ssl_context)
259+
_, x509 = route.post_certificate_renewal(ssl_context)
260+
cert = OpenSSL::X509::Certificate.new(x509)
261+
Puppet.notice _("Downloaded certificate '%{name}' with fingerprint %{fingerprint}") % { name: Puppet[:certname], fingerprint: fingerprint(cert) }
262+
263+
@cert_provider.save_client_cert(certname, cert)
264+
@cert_provider.delete_request(certname)
265+
cert
266+
rescue Puppet::HTTP::ResponseError => e
267+
if e.response.code == 404
268+
nil
269+
else
270+
raise Puppet::Error.new(_("Failed to download certificate: %{message}") % { message: e.message }, e)
271+
end
272+
rescue => e
273+
raise Puppet::Error.new(_("Failed to download certificate: %{message}") % { message: e.message }, e)
274+
end
275+
251276
def verify(certname)
252277
password = @cert_provider.load_private_key_password
253278
ssl_context = @ssl_provider.load_context(certname: certname, password: password)

0 commit comments

Comments
 (0)