Skip to content

Commit b62720f

Browse files
committed
Reapply "Send passwords via environment variables"
This reverts commit 41513a9. The previously implementation contained bugs and this is a proper fix.
1 parent bae5c27 commit b62720f

File tree

8 files changed

+171
-92
lines changed

8 files changed

+171
-92
lines changed

lib/puppet/provider/x509_cert/openssl.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ def exists?
5757
end
5858

5959
def create
60+
env = {}
61+
6062
if resource[:csr]
6163
options = [
6264
'x509',
@@ -92,9 +94,15 @@ def create
9294

9395
password = resource[:cakey_password] || resource[:password]
9496

95-
options += ['-passin', "pass:#{password}"] if password
97+
if password
98+
options += ['-passin', 'env:CERTIFICATE_PASSIN']
99+
env['CERTIFICATE_PASSIN'] = password
100+
end
96101
options += ['-extensions', 'v3_req'] if resource[:req_ext] != :false
97-
openssl options
102+
103+
# openssl(options) doesn't work because it's impossible to pass an env
104+
# https://github.com/puppetlabs/puppet/issues/9493
105+
execute([command('openssl')] + options, { failonfail: true, combine: true, custom_environment: env })
98106
end
99107

100108
def destroy

lib/puppet/provider/x509_request/openssl.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,23 @@ def exists?
2828
end
2929

3030
def create
31+
env = {}
3132
options = [
3233
'req', '-new',
3334
'-key', resource[:private_key],
3435
'-config', resource[:template],
3536
'-out', resource[:path]
3637
]
3738

38-
options += ['-passin', "pass:#{resource[:password]}"] if resource[:password]
39-
options += ['-nodes'] unless resource[:encrypted]
39+
if resource[:password]
40+
options += ['-passin', 'env:CERTIFICATE_PASSIN']
41+
env['CERTIFICATE_PASSIN'] = resource[:password]
42+
end
43+
options << '-nodes' unless resource[:encrypted]
4044

41-
openssl options
45+
# openssl(options) doesn't work because it's impossible to pass an env
46+
# https://github.com/puppetlabs/puppet/issues/9493
47+
execute([command('openssl')] + options, { failonfail: true, combine: true, custom_environment: env })
4248
end
4349

4450
def destroy

manifests/export/pem_cert.pp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@
4444
$in_cert = $pfx_cert
4545
}
4646

47-
$passin_opt = $in_pass ? {
48-
undef => [],
49-
default => ['-nokeys', '-passin', "pass:${in_pass}"],
47+
if $in_pass {
48+
$passin_opt = ['-nokeys', '-passin', 'env:CERTIFICATE_PASSIN']
49+
$passin_env = ["CERTIFICATE_PASSIN=${in_pass}"]
50+
} else {
51+
$passin_opt = []
52+
$passin_env = []
5053
}
5154

5255
if $ensure == 'present' {
@@ -62,9 +65,10 @@
6265
}
6366

6467
exec { "Export ${in_cert} to ${pem_cert}":
65-
command => $cmd,
66-
path => $facts['path'],
67-
* => $exec_params,
68+
command => $cmd,
69+
environment => $passin_env,
70+
path => $facts['path'],
71+
* => $exec_params,
6872
}
6973
} else {
7074
file { $pem_cert:

manifests/export/pem_key.pp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,20 @@
2525
Optional[String] $out_pass = undef,
2626
) {
2727
if $ensure == 'present' {
28-
$passin_opt = $in_pass ? {
29-
undef => [],
30-
default => ['-passin', "pass:${in_pass}"],
28+
if $in_pass {
29+
$passin_opt = ['-nokeys', '-passin', 'env:CERTIFICATE_PASSIN']
30+
$passin_env = ["CERTIFICATE_PASSIN=${in_pass}"]
31+
} else {
32+
$passin_opt = []
33+
$passin_env = []
3134
}
3235

33-
$passout_opt = $out_pass ? {
34-
undef => ['-nodes'],
35-
default => ['-passout', "pass:${out_pass}"],
36+
if $out_pass {
37+
$passout_opt = ['-nokeys', '-passout', 'env:CERTIFICATE_PASSOUT']
38+
$passout_env = ["CERTIFICATE_PASSOUT=${out_pass}"]
39+
} else {
40+
$passout_opt = []
41+
$passout_env = []
3642
}
3743

3844
$cmd = [
@@ -52,9 +58,10 @@
5258
}
5359

5460
exec { "Export ${pfx_cert} to ${pem_key}":
55-
command => $cmd,
56-
path => $facts['path'],
57-
* => $exec_params,
61+
command => $cmd,
62+
environment => $passin_env + $passout_env,
63+
path => $facts['path'],
64+
* => $exec_params,
5865
}
5966
} else {
6067
file { $pem_key:

manifests/export/pkcs12.pp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,20 @@
3333
$full_path = "${basedir}/${name}.p12"
3434

3535
if $ensure == 'present' {
36-
$pass_opt = $in_pass ? {
37-
undef => [],
38-
default => ['-passin', "pass:${in_pass}"],
36+
if $in_pass {
37+
$passin_opt = ['-nokeys', '-passin', 'env:CERTIFICATE_PASSIN']
38+
$passin_env = ["CERTIFICATE_PASSIN=${in_pass}"]
39+
} else {
40+
$passin_opt = []
41+
$passin_env = []
3942
}
4043

41-
$passout_opt = $out_pass ? {
42-
undef => [],
43-
default => ['-passout', "pass:${out_pass}"],
44+
if $out_pass {
45+
$passout_opt = ['-nokeys', '-passout', 'env:CERTIFICATE_PASSOUT']
46+
$passout_env = ["CERTIFICATE_PASSOUT=${out_pass}"]
47+
} else {
48+
$passout_opt = []
49+
$passout_env = []
4450
}
4551

4652
$chain_opt = $chaincert ? {
@@ -55,7 +61,7 @@
5561
'-out', $full_path,
5662
'-name', $name,
5763
'-nodes', '-noiter',
58-
] + $chain_opt + $pass_opt + $passout_opt
64+
] + $chain_opt + $passin_opt + $passout_opt
5965

6066
if $dynamic {
6167
$exec_params = {
@@ -67,9 +73,10 @@
6773
}
6874

6975
exec { "Export ${name} to ${full_path}":
70-
command => $cmd,
71-
path => $facts['path'],
72-
* => $exec_params,
76+
command => $cmd,
77+
environment => $passin_env + $passout_env,
78+
path => $facts['path'],
79+
* => $exec_params,
7380
}
7481
} else {
7582
file { $full_path:

spec/defines/openssl_export_pem_cert_spec.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@
7979

8080
it {
8181
is_expected.to contain_exec('Export /etc/ssl/certs/foo.pfx to /etc/ssl/certs/foo.pem').with(
82-
command: ['openssl', 'pkcs12', '-in', '/etc/ssl/certs/foo.pfx', '-out', '/etc/ssl/certs/foo.pem', '-nokeys', '-passin', 'pass:5r$}^'],
82+
command: ['openssl', 'pkcs12', '-in', '/etc/ssl/certs/foo.pfx', '-out', '/etc/ssl/certs/foo.pem', '-nokeys', '-passin', 'env:CERTIFICATE_PASSIN'],
83+
environment: ['CERTIFICATE_PASSIN=5r$}^'],
8384
creates: '/etc/ssl/certs/foo.pem',
8485
path: '/usr/bin:/bin:/usr/sbin:/sbin'
8586
)

spec/unit/puppet/provider/x509_cert/openssl_spec.rb

Lines changed: 78 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
require 'pathname'
66
require 'puppet/type/x509_cert'
77

8-
provider_class = Puppet::Type.type(:x509_cert).provider(:openssl)
98
describe 'The openssl provider for the x509_cert type' do
109
let(:path) { '/tmp/foo.crt' }
1110
let(:pathname) { Pathname.new(path) }
@@ -31,33 +30,49 @@
3130
end
3231

3332
it 'creates a certificate with the proper options' do
34-
expect(provider_class).to receive(:openssl).with([
35-
'req',
36-
'-config', '/tmp/foo.cnf',
37-
'-new',
38-
'-x509',
39-
'-days', 3650,
40-
'-key', '/tmp/foo.key',
41-
'-out', '/tmp/foo.crt',
42-
'-extensions', 'v3_req',
43-
])
33+
expect(resource.provider).to receive(:execute).with(
34+
[
35+
'/usr/bin/openssl',
36+
'req',
37+
'-config', '/tmp/foo.cnf',
38+
'-new',
39+
'-x509',
40+
'-days', 3650,
41+
'-key', '/tmp/foo.key',
42+
'-out', '/tmp/foo.crt',
43+
'-extensions', 'v3_req',
44+
],
45+
{
46+
combine: true,
47+
custom_environment: {},
48+
failonfail: true,
49+
}
50+
)
4451
resource.provider.create
4552
end
4653

4754
context 'when using password' do
4855
it 'creates a certificate with the proper options' do
4956
resource[:password] = '2x6${'
50-
expect(provider_class).to receive(:openssl).with([
51-
'req',
52-
'-config', '/tmp/foo.cnf',
53-
'-new',
54-
'-x509',
55-
'-days', 3650,
56-
'-key', '/tmp/foo.key',
57-
'-out', '/tmp/foo.crt',
58-
'-passin', 'pass:2x6${',
59-
'-extensions', 'v3_req',
60-
])
57+
expect(resource.provider).to receive(:execute).with(
58+
[
59+
'/usr/bin/openssl',
60+
'req',
61+
'-config', '/tmp/foo.cnf',
62+
'-new',
63+
'-x509',
64+
'-days', 3650,
65+
'-key', '/tmp/foo.key',
66+
'-out', '/tmp/foo.crt',
67+
'-passin', 'env:CERTIFICATE_PASSIN',
68+
'-extensions', 'v3_req',
69+
],
70+
{
71+
combine: true,
72+
custom_environment: { 'CERTIFICATE_PASSIN' => '2x6${' },
73+
failonfail: true,
74+
}
75+
)
6176
resource.provider.create
6277
end
6378
end
@@ -68,18 +83,26 @@
6883
resource[:csr] = '/tmp/foo.csr'
6984
resource[:ca] = '/tmp/foo-ca.crt'
7085
resource[:cakey] = '/tmp/foo-ca.key'
71-
expect(provider_class).to receive(:openssl).with([
72-
'x509',
73-
'-req',
74-
'-days', 3650,
75-
'-in', '/tmp/foo.csr',
76-
'-out', '/tmp/foo.crt',
77-
'-extfile', '/tmp/foo.cnf',
78-
'-CAcreateserial',
79-
'-CA', '/tmp/foo-ca.crt',
80-
'-CAkey', '/tmp/foo-ca.key',
81-
'-extensions', 'v3_req',
82-
])
86+
expect(resource.provider).to receive(:execute).with(
87+
[
88+
'/usr/bin/openssl',
89+
'x509',
90+
'-req',
91+
'-days', 3650,
92+
'-in', '/tmp/foo.csr',
93+
'-out', '/tmp/foo.crt',
94+
'-extfile', '/tmp/foo.cnf',
95+
'-CAcreateserial',
96+
'-CA', '/tmp/foo-ca.crt',
97+
'-CAkey', '/tmp/foo-ca.key',
98+
'-extensions', 'v3_req',
99+
],
100+
{
101+
combine: true,
102+
custom_environment: {},
103+
failonfail: true,
104+
}
105+
)
83106
resource.provider.create
84107
end
85108
end
@@ -90,19 +113,27 @@
90113
resource[:ca] = '/tmp/foo-ca.crt'
91114
resource[:cakey] = '/tmp/foo-ca.key'
92115
resource[:cakey_password] = '5i;6%'
93-
expect(provider_class).to receive(:openssl).with([
94-
'x509',
95-
'-req',
96-
'-days', 3650,
97-
'-in', '/tmp/foo.csr',
98-
'-out', '/tmp/foo.crt',
99-
'-extfile', '/tmp/foo.cnf',
100-
'-CAcreateserial',
101-
'-CA', '/tmp/foo-ca.crt',
102-
'-CAkey', '/tmp/foo-ca.key',
103-
'-passin', 'pass:5i;6%',
104-
'-extensions', 'v3_req',
105-
])
116+
expect(resource.provider).to receive(:execute).with(
117+
[
118+
'/usr/bin/openssl',
119+
'x509',
120+
'-req',
121+
'-days', 3650,
122+
'-in', '/tmp/foo.csr',
123+
'-out', '/tmp/foo.crt',
124+
'-extfile', '/tmp/foo.cnf',
125+
'-CAcreateserial',
126+
'-CA', '/tmp/foo-ca.crt',
127+
'-CAkey', '/tmp/foo-ca.key',
128+
'-passin', 'env:CERTIFICATE_PASSIN',
129+
'-extensions', 'v3_req',
130+
],
131+
{
132+
combine: true,
133+
custom_environment: { 'CERTIFICATE_PASSIN' => '5i;6%' },
134+
failonfail: true,
135+
}
136+
)
106137
resource.provider.create
107138
end
108139
end

0 commit comments

Comments
 (0)