Skip to content

Commit f57d3ea

Browse files
committed
Provide upgrade utility
Provide a utility plan to re-issue certificates on systems that were deployed using peadm 0.5.x, using the new OIDs in use in peadm 1.x.
1 parent ac9e55e commit f57d3ea

File tree

4 files changed

+73
-2
lines changed

4 files changed

+73
-2
lines changed

functions/oid.pp

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ function peadm::oid (
44
case $short_name {
55
'peadm_role': { '1.3.6.1.4.1.34380.1.1.9812' }
66
'peadm_availability_group': { '1.3.6.1.4.1.34380.1.1.9813' }
7+
'pp_application': { '1.3.6.1.4.1.34380.1.1.8' }
8+
'pp_cluster': { '1.3.6.1.4.1.34380.1.1.16' }
79
default: { fail("No peadm OID for ${short_name}") }
810
}
911
}

plans/misc/upgrade_trusted_facts.pp

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
plan peadm::misc::upgrade_trusted_facts (
2+
TargetSpec $targets,
3+
Peadm::SingleTargetSpec $master_host,
4+
Boolean $autosign = false,
5+
) {
6+
7+
# Convert input into array of Targets
8+
$all_targets = peadm::get_targets($targets)
9+
$master_target = peadm::get_targets($master_host, 1)
10+
11+
$certdata = run_task('peadm::trusted_facts', $all_targets).reduce({}) |$memo,$result| {
12+
# Keep the the OID-form trusted fact key/value pairs. If we accidentally
13+
# include an OID and also a shortname that resolves to the same OID,
14+
# there'll be a problem trying to sign the cert.
15+
$memo + { $result.target => ($result.value + {
16+
'extensions' => ($result['extensions'].filter |$k,$v| {
17+
$k =~ /^1\.3\.6\.1\.4\.1\.34380\.1/
18+
})
19+
})}
20+
}
21+
22+
$pserver = '/opt/puppetlabs/bin/puppetserver'
23+
$puppet = '/opt/puppetlabs/bin/puppet'
24+
25+
$upgrade_results = $all_targets.map |$target| {
26+
$new_trusted = $certdata[$target]['extensions'] + {
27+
peadm::oid('peadm_role') => $certdata[$target]['extensions'][peadm::oid('pp_application')],
28+
peadm::oid('peadm_availability_group') => $certdata[$target]['extensions'][peadm::oid('pp_cluster')],
29+
}
30+
31+
run_plan('peadm::util::insert_csr_extensions', $target,
32+
extensions => $new_trusted,
33+
merge => false,
34+
)
35+
36+
run_command("${pserver} ca clean --certname ${certdata[$target]['certname']}", $master_target)
37+
run_command("${puppet} ssl clean --certname ${certdata[$target]['certname']}", $target)
38+
run_command("${puppet} ssl submit_request --certname ${certdata[$target]['certname']}", $target)
39+
40+
ctrl::sleep(2) # some lag sometimes before the cert is available to sign
41+
42+
if !$autosign {
43+
run_command("${pserver} ca sign --certname ${certdata[$target]['certname']}", $master_target)
44+
}
45+
46+
run_command("${puppet} ssl download_cert --certname ${certdata[$target]['certname']}", $target)
47+
}
48+
49+
}

plans/util/insert_csr_extensions.pp

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plan peadm::util::insert_csr_extensions (
22
TargetSpec $targets,
33
Hash $extensions,
4+
Boolean $merge = true,
45
) {
56
get_targets($targets).each |$target| {
67
$csr_attributes_data = ($csr_file = run_task('peadm::read_file', $target,
@@ -10,9 +11,17 @@
1011
default => $csr_file.parseyaml,
1112
}
1213

14+
# If we're merging extension requests, existing requests will be preserved.
15+
# If we're not merging, only ours will be used; existing requests will be
16+
# overritten.
17+
$csr_file_data = $merge ? {
18+
true => $csr_attributes_data.deep_merge({'extension_requests' => $extensions}),
19+
false => ($csr_attributes_data + {'extension_requests' => $extensions}),
20+
}
21+
1322
run_task('peadm::mkdir_p_file', $target,
1423
path => '/etc/puppetlabs/puppet/csr_attributes.yaml',
15-
content => $csr_attributes_data.deep_merge({'extension_requests' => $extensions}).to_yaml,
24+
content => $csr_file_data.to_yaml,
1625
)
1726
}
1827
}

tasks/trusted_facts.rb

+12-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
cert = OpenSSL::X509::Certificate.new(raw)
1919

2020
extensions = cert.extensions.reduce({}) do |memo, ext|
21+
next memo unless ext.oid.start_with?('1.3.6.1.4.1.34380.1') # ppCertExt
2122
case oids[ext.oid]
2223
when nil
2324
memo.merge(ext.oid => ext.value[2..-1])
@@ -27,6 +28,16 @@
2728
end
2829
end
2930

30-
result = { 'extensions' => extensions }
31+
alt_names = cert.extensions.select do |ext|
32+
ext.oid == 'subjectAltName'
33+
end.map do |ext|
34+
ext.value.split(', ').map { |str| str[4..-1] }
35+
end.first
36+
37+
result = {
38+
'certname' => certname,
39+
'dns-alt-names' => alt_names,
40+
'extensions' => extensions,
41+
}
3142

3243
puts result.to_json

0 commit comments

Comments
 (0)