Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(PUP-11856) State machine renews host cert #9075

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/puppet/http/service/ca.rb
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def put_certificate_request(name, csr, ssl_context: nil)
#
# @param [Puppet::SSL::SSLContext] ssl_context
#
# @return [Puppet::HTTP::Response] The request response
# @return [Array<Puppet::HTTP::Response, String>] The request response
#
# @api public
def post_certificate_renewal(ssl_context)
Expand Down
50 changes: 48 additions & 2 deletions lib/puppet/ssl/state_machine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,11 @@ def next_state
next_ctx = @ssl_provider.create_context(
cacerts: @ssl_context.cacerts, crls: @ssl_context.crls, private_key: key, client_cert: cert
)
return Done.new(@machine, next_ctx)
if needs_refresh?(cert)
return NeedRenewedCert.new(@machine, next_ctx, key)
else
return Done.new(@machine, next_ctx)
end
end
else
if Puppet[:key_type] == 'ec'
Expand All @@ -278,6 +282,15 @@ def next_state

NeedSubmitCSR.new(@machine, @ssl_context, key)
end

private

def needs_refresh?(cert)
cert_ttl = Puppet[:hostcert_renewal_interval]
return false unless cert_ttl

Time.now.to_i >= (cert.not_after.to_i - cert_ttl)
end
end

# Base class for states with a private key.
Expand Down Expand Up @@ -349,6 +362,39 @@ def next_state
end
end

# Class to renew a client/host certificate automatically.
#
class NeedRenewedCert < KeySSLState
def next_state
Puppet.debug(_("Renewing client certificate"))

route = @machine.session.route_to(:ca, ssl_context: @ssl_context)
cert = OpenSSL::X509::Certificate.new(
route.post_certificate_renewal(@ssl_context)[1]
)

# verify client cert before saving
next_ctx = @ssl_provider.create_context(
cacerts: @ssl_context.cacerts, crls: @ssl_context.crls, private_key: @private_key, client_cert: cert
)
@cert_provider.save_client_cert(Puppet[:certname], cert)

joshcooper marked this conversation as resolved.
Show resolved Hide resolved
Puppet.info(_("Refreshed client certificate: %{cert_digest}, not before '%{not_before}', not after '%{not_after}'") % { cert_digest: @machine.digest_as_hex(cert.to_pem), not_before: cert.not_before, not_after: cert.not_after })

Done.new(@machine, next_ctx)
rescue Puppet::HTTP::ResponseError => e
if e.response.code == 404
Puppet.info(_("Certificate autorenewal has not been enabled on the server."))
mhashizume marked this conversation as resolved.
Show resolved Hide resolved
else
Puppet.warning(_("Failed to automatically renew certificate: %{code} %{reason}") % { code: e.response.code, reason: e.response.reason })
end
Done.new(@machine, @ssl_context)
rescue => e
Puppet.warning(_("Unable to automatically renew certificate: %{message}") % { message: e })
Done.new(@machine, @ssl_context)
end
joshcooper marked this conversation as resolved.
Show resolved Hide resolved
end

# We cannot make progress, so wait if allowed to do so, or exit.
#
class Wait < SSLState
Expand Down Expand Up @@ -500,7 +546,7 @@ def ensure_ca_certificates
final_state.ssl_context
end

# Run the state machine for CA certs and CRLs.
# Run the state machine for client certs.
#
# @return [Puppet::SSL::SSLContext] initialized SSLContext
# @raise [Puppet::Error] If we fail to generate an SSLContext
Expand Down
214 changes: 107 additions & 107 deletions spec/fixtures/ssl/127.0.0.1-key.pem
Original file line number Diff line number Diff line change
@@ -1,117 +1,117 @@
RSA Private-Key: (2048 bit, 2 primes)
Private-Key: (2048 bit, 2 primes)
modulus:
00:df:40:52:59:4f:eb:dd:d8:06:f5:c0:e8:eb:11:
52:31:80:a1:45:8e:3e:07:81:5c:cd:90:ea:2a:d0:
84:d3:6d:54:8a:78:0c:6b:34:eb:fc:dd:90:e9:9a:
5a:23:24:3b:31:99:17:d9:06:70:a8:51:95:68:50:
9d:59:aa:76:2f:28:18:99:81:be:ca:1d:79:75:8b:
85:3c:a4:05:39:06:f6:d8:25:13:54:e8:bb:d2:b4:
30:35:9e:10:64:2d:25:44:2a:f8:75:1f:60:ec:8a:
57:fc:fe:4d:57:f2:9c:e2:0d:6b:c5:f7:2d:ce:f5:
9e:93:f8:83:1a:b6:94:e3:c0:e2:b2:56:92:7e:e5:
d2:bd:f8:3c:9d:07:b4:85:93:77:5f:62:bd:ba:0e:
30:cc:77:46:07:2a:6a:aa:18:bf:0c:f0:23:ef:7d:
d9:84:86:35:3e:b5:76:1a:02:f3:9a:11:70:3f:f0:
6d:58:d1:2a:19:f8:e1:ed:77:ab:0a:e7:98:12:33:
5e:f9:b0:a8:f8:a5:98:c9:4e:3f:6c:01:8a:94:30:
c9:19:a1:29:46:18:5e:83:9f:9d:2a:cb:70:db:8a:
de:ca:2d:c1:47:82:ba:0b:20:b9:20:09:3c:1d:1c:
62:77:a7:85:83:5a:08:28:34:6b:75:e1:cd:7b:b7:
e7:e5
00:d0:13:11:3b:81:35:76:84:fb:b6:4e:c6:e2:7d:
1a:16:a5:88:08:dd:50:fd:08:04:a6:ea:a0:6d:09:
8c:f2:bf:68:4b:a0:7b:68:84:b3:e4:51:e1:62:3c:
68:06:c8:38:3b:0a:a5:8b:da:87:25:cd:2a:76:0b:
82:71:89:5b:11:57:cb:dd:b5:ec:75:56:06:a1:26:
57:08:54:2d:83:c9:2f:83:f6:d0:e0:c3:ee:78:14:
47:f4:5b:ed:54:6a:93:fe:f0:68:a4:fa:93:8c:72:
f0:4b:84:f9:94:a2:ed:d8:83:79:9a:0c:c7:d4:33:
8e:e6:76:fd:cc:93:e3:3a:b7:56:97:85:f9:87:7e:
a9:60:e2:fd:35:9e:31:6b:2e:cb:86:47:e2:67:08:
fe:13:52:aa:64:d4:7c:76:09:b5:99:17:19:ed:6b:
76:6c:e8:09:b5:98:06:59:c0:4a:1a:0a:a5:f9:0a:
73:7c:56:46:32:17:80:3f:09:fa:a7:00:bb:a6:8b:
d0:20:83:fe:ab:3c:a6:bf:ed:e6:e4:71:5e:8a:12:
da:65:2a:9a:c9:9a:bd:a7:d4:56:c5:42:b9:bc:0f:
0d:19:35:d1:72:37:30:e0:28:0f:36:91:a2:7b:e3:
62:37:0e:5c:ba:0d:26:dc:0a:66:b3:18:ed:6e:d1:
63:b7
publicExponent: 65537 (0x10001)
privateExponent:
00:bc:48:9b:2b:07:e4:7d:2c:fc:71:b7:48:b9:37:
da:82:35:61:ce:2f:b0:d0:d3:a1:59:1d:a6:e0:85:
0c:00:e4:6c:30:7c:1e:bd:2b:dc:fb:5e:42:21:42:
34:52:fe:f3:8d:58:f8:6b:e8:aa:8a:ca:83:9f:7e:
9d:b6:49:b5:72:ff:f5:ff:41:15:8f:90:5c:27:6e:
8b:e8:20:cc:e6:d3:a0:cb:9a:39:3b:9b:2d:0c:ff:
3a:c9:7d:8d:85:6f:2d:c6:d8:16:c3:70:bb:65:c3:
27:82:0f:57:5b:9d:1a:02:ec:1e:c0:cf:3e:ab:15:
2b:b0:d0:1e:82:21:0a:61:29:70:2a:34:5b:15:18:
67:30:5e:88:ad:d9:e4:59:61:7f:cc:4b:b2:9a:cf:
ac:49:fe:49:63:0a:14:db:89:49:22:6f:64:8b:bc:
62:4d:61:44:05:be:cc:5c:0c:2f:0e:fa:5f:6a:2e:
10:64:a4:db:86:1a:a9:da:1a:0d:ce:57:ec:c1:03:
7a:00:bd:49:31:b4:8b:bd:56:99:a2:14:dd:78:82:
ea:09:9f:74:12:bd:45:56:b5:6e:ee:d6:69:47:68:
e6:6d:75:ea:87:e1:6a:88:8b:b1:c2:7a:ae:35:89:
a3:3c:86:97:d1:de:ba:14:2b:d0:d1:3e:d7:af:92:
86:01
1a:08:60:ae:10:b6:e7:2a:b1:31:78:7e:b2:a4:93:
48:85:12:55:85:97:15:e9:54:67:ab:d0:41:84:21:
e1:d7:27:cd:da:78:c6:35:60:2a:6f:42:23:1f:ca:
a6:1a:93:ca:73:45:0e:0f:db:bb:d3:84:fd:fa:e7:
a9:9b:d5:4c:80:af:0d:80:ae:e2:69:4e:70:08:13:
78:83:cb:a4:02:de:52:84:e5:52:51:c1:3a:bd:d2:
d8:d4:4d:87:b3:c3:eb:70:19:af:96:78:32:68:c8:
fe:b1:d6:e6:0d:52:73:b5:d3:57:7e:44:dc:1c:4d:
43:31:5d:04:a4:f6:17:88:d1:c2:3c:05:a0:e9:06:
a4:00:0a:db:5d:1b:1d:77:64:fd:b5:23:57:27:9c:
91:2f:da:7a:81:a4:3e:fe:e0:f2:5e:00:b7:55:02:
84:b0:07:17:f9:64:4a:a2:61:4e:9b:48:85:d7:5b:
34:c3:e6:d2:01:9d:20:3f:76:db:7d:f0:96:f8:80:
2c:f0:f2:88:8a:99:be:49:20:05:8b:64:aa:54:4b:
5b:d5:75:d7:30:0d:29:4a:07:c2:06:77:f5:b6:bc:
68:8d:eb:98:30:6e:42:f6:1d:da:8d:0a:bd:ad:11:
eb:44:01:17:e8:a1:55:06:76:37:84:9c:af:ce:fd:
81
prime1:
00:fc:aa:e9:66:8b:09:55:59:35:21:19:ff:72:8a:
47:cc:ed:36:24:3a:6c:ee:81:75:cd:aa:6d:af:1f:
4d:83:a5:e5:77:c8:a2:de:72:11:a0:72:af:79:0a:
b5:b0:e5:e4:28:75:11:b5:56:eb:86:32:f0:32:1f:
1d:a8:26:9f:40:d7:6c:ae:7c:7d:90:27:39:95:0f:
6b:0a:91:3e:03:c1:e8:04:01:2e:16:a0:dc:6e:70:
9f:1a:17:c1:7e:65:ea:4c:2d:33:00:23:83:d9:3b:
f7:a5:0b:5f:f5:a9:65:7d:bd:1e:79:e9:24:62:a3:
49:d7:d2:6f:5f:9e:2e:03:75
00:f8:0b:a4:03:60:bf:e6:54:b2:c3:8f:63:a4:71:
50:84:81:9b:80:fb:19:ce:f1:68:39:8b:0e:65:a6:
3a:f3:78:00:7b:83:bf:4a:dc:49:bc:9e:42:fd:7e:
69:e9:13:56:cb:f9:78:e1:8e:f5:13:fc:dd:a5:5a:
0d:24:2c:06:57:1d:fe:b4:23:88:6d:a1:91:53:72:
9c:95:4f:93:31:26:54:a2:49:c2:a7:ca:c7:a5:94:
0d:15:2e:8e:a3:54:3a:ee:6f:fd:2d:52:55:ed:22:
84:53:29:51:de:2d:98:3e:22:82:60:e8:96:34:a7:
d0:31:9a:19:f7:d2:db:27:37
prime2:
00:e2:32:17:38:94:ba:d3:63:eb:a3:83:77:09:4f:
ef:52:ef:ce:1e:86:b2:4e:bc:30:eb:67:f2:c1:aa:
be:04:fd:c5:76:43:15:e7:7f:f7:c7:a3:6f:e9:e3:
df:7e:ad:9c:a1:eb:ee:dc:ad:6d:bc:4e:88:1c:d4:
d1:5c:1d:21:f0:7a:19:4d:cc:0d:4b:37:08:34:8d:
ac:1c:fd:3a:e9:f3:5e:f3:f2:5a:1c:15:76:38:d3:
ff:b5:2f:fd:59:37:c6:86:6e:29:4b:10:01:75:f0:
5e:46:aa:ab:32:e3:0f:4c:72:e7:36:d7:5a:9b:76:
e2:08:09:32:49:30:ac:f4:b1
00:d6:bf:47:ab:68:ce:0b:0f:1a:13:fb:ce:ca:66:
e4:a5:dd:a0:7f:d2:77:89:66:5f:08:33:6c:1d:e1:
0d:b7:d5:88:bb:00:4b:0f:85:9c:83:42:9f:01:64:
e0:c5:0f:5d:19:4b:bc:af:71:7d:5e:eb:7b:aa:69:
75:11:75:81:4c:42:f4:b2:8a:29:7e:7a:1b:e6:a3:
b2:20:6f:07:b9:f9:03:8e:5a:2a:af:f5:5a:2d:a0:
00:db:b6:22:e8:8d:1d:d0:69:3d:01:e9:05:eb:8b:
2c:89:77:c3:a3:10:57:2c:7f:e3:70:72:d3:56:9f:
72:b9:ea:07:56:02:00:e7:81
exponent1:
44:c4:8b:a3:d2:21:a7:2e:11:6c:c1:f3:a9:8c:03:
40:be:2b:27:2f:13:a8:d2:69:6a:a1:81:1a:d1:ad:
3a:30:73:c4:e7:41:94:c3:7d:12:ab:44:20:f0:8e:
44:e8:3c:f1:d9:f3:08:e4:f0:53:65:17:c4:bc:7d:
48:df:c2:26:56:bb:88:bd:ef:3a:c5:c2:41:54:a1:
f0:8d:59:50:92:7d:00:62:05:d6:38:cf:e5:eb:17:
12:75:f6:be:dd:24:28:b9:80:91:00:19:89:8d:6d:
b8:68:e1:24:2e:87:a5:f2:4c:12:28:27:34:05:77:
3a:9b:56:9e:b2:a1:99:65
00:d0:80:70:78:ca:6d:e4:be:53:9a:21:40:ff:ec:
a4:63:0d:d3:5a:43:38:79:84:e1:38:65:94:4f:8b:
c0:c8:01:9a:5e:38:eb:a6:90:af:86:d6:7d:b7:39:
f8:eb:0b:ef:8c:fc:02:49:8f:f2:a0:bf:90:cc:ba:
7a:8b:6a:5a:56:06:87:a0:82:b1:de:7d:ce:7c:17:
be:59:a0:0f:39:64:60:06:1e:fc:7a:30:f1:4b:54:
bc:fe:8e:29:26:4f:da:4d:ad:63:63:22:6f:ca:2a:
96:92:95:0c:15:37:bc:5e:96:81:83:d6:5e:d4:9a:
2f:5e:52:8b:fb:8e:89:db:57
exponent2:
00:d3:3b:d7:f7:9c:dd:43:9f:e2:64:56:d7:09:39:
3e:d4:02:e2:48:1b:9d:d4:6d:66:79:d0:1f:21:c0:
e3:a7:21:9e:0f:ac:e2:7d:c8:41:8a:8c:14:6d:25:
c2:87:38:76:37:b8:6e:de:62:8f:41:f5:4c:a3:30:
13:3b:a4:71:17:73:ce:c1:9a:37:27:f0:82:97:21:
5e:83:cb:f0:02:9e:a6:23:c6:45:64:48:9e:98:bf:
51:e2:d0:a8:15:73:42:d0:33:7c:18:7f:1f:fe:15:
b4:d4:e5:78:ef:12:a0:2c:d2:79:1d:fb:ca:bf:b8:
2b:a9:39:7d:5e:60:38:84:61
5b:99:de:05:64:c0:37:01:6b:1b:49:16:ed:49:34:
90:f7:d7:85:8e:8e:44:c2:b1:18:bb:6e:8b:d4:3a:
d8:c6:b1:fb:2a:65:da:2a:21:17:f0:6c:08:d9:31:
f3:7c:d9:36:78:12:f5:37:50:c6:13:66:7d:cb:5c:
0f:65:73:10:c7:a2:bf:21:a6:0f:78:20:bc:a1:e8:
d2:62:ea:05:cf:0d:50:44:6f:de:fc:a6:49:bd:ed:
7f:ca:d2:5b:26:0e:a8:9e:ab:52:4c:46:a5:31:89:
7e:dd:e2:4a:85:26:da:29:77:27:b9:23:22:d9:02:
c4:00:ea:be:2a:3e:9e:81
coefficient:
0b:f3:f3:f2:06:4d:f4:8d:dc:88:d0:da:24:f1:03:
4a:5f:91:40:29:ff:85:be:a1:6c:e2:00:ac:05:46:
79:db:9d:b6:5f:7e:92:a7:cb:f1:77:e6:4e:c6:b9:
ee:76:0e:fe:c3:ba:91:69:00:75:dc:d6:76:2e:f1:
dd:1b:75:5d:3b:f4:6b:d6:a2:3d:bf:8e:49:45:0f:
b1:4e:c6:e5:fb:c3:91:05:92:51:b1:c1:59:97:e0:
1a:a5:c9:ee:3f:af:32:dc:0c:4a:00:37:04:94:64:
fa:97:ab:47:17:fe:ce:bb:d4:6c:02:26:5d:41:1f:
42:8b:06:d9:e0:a0:ae:68
08:16:69:41:c7:f5:15:7a:f9:0d:3d:b8:d2:4d:8f:
82:22:2f:89:76:11:5d:e9:7f:fc:d3:e4:76:ba:46:
44:eb:91:be:45:e1:1c:5c:75:1e:ff:c3:b2:5c:ae:
0f:a7:fb:16:2a:e2:9d:26:4f:ab:40:f2:d4:33:a3:
fd:c7:76:e0:f3:b9:f6:ff:05:92:8b:60:15:fc:76:
d1:f7:b2:45:8a:4e:4d:16:23:5a:d0:27:81:fb:61:
94:b1:aa:38:ea:1d:81:52:0b:e3:8f:59:40:e1:35:
d7:ee:cb:80:2d:28:15:b8:61:07:d0:50:da:89:83:
5b:88:5b:2e:fb:20:9b:fd
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
Loading