@@ -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