Class: Puppet::X509::CertProvider Private
- Includes:
- PemStore
- Defined in:
- lib/puppet/x509/cert_provider.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Class for loading and saving cert related objects. By default the provider loads and saves based on puppet’s default settings, such as Puppet[:localcacert]. The providers sets the permissions on files it saves, such as the private key. All of the load_* methods take an optional required parameter. If an object doesn’t exist, then by default the provider returns nil. However, if the required parameter is true, then an exception will be raised instead.
Constant Summary collapse
- VALID_CERTNAME =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Only allow printing ascii characters, excluding /
/\A[ -.0-~]+\Z/- CERT_DELIMITERS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
/-----BEGIN CERTIFICATE-----.*?-----END CERTIFICATE-----/m
- CRL_DELIMITERS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
/-----BEGIN X509 CRL-----.*?-----END X509 CRL-----/m
Instance Method Summary collapse
-
#ca_last_update ⇒ Time?
private
Return the time when the CA bundle was last updated.
-
#ca_last_update=(time) ⇒ Object
private
Set the CA bundle last updated time.
-
#create_request(name, private_key) ⇒ Puppet::X509::Request
private
Create a certificate signing request (CSR).
-
#crl_last_update ⇒ Time?
private
Return the time when the CRL was last updated.
-
#crl_last_update=(time) ⇒ Object
private
Set the CRL last updated time.
-
#delete_request(name) ⇒ Boolean
private
Delete a named certificate signing request (CSR) from the configured
requestdir. -
#initialize(capath: Puppet[:localcacert], crlpath: Puppet[:hostcrl], privatekeydir: Puppet[:privatekeydir], certdir: Puppet[:certdir], requestdir: Puppet[:requestdir], hostprivkey: Puppet.settings.set_by_config?(:hostprivkey) ? Puppet[:hostprivkey] : nil, hostcert: Puppet.settings.set_by_config?(:hostcert) ? Puppet[:hostcert] : nil) ⇒ CertProvider
constructor
private
A new instance of CertProvider.
-
#load_cacerts(required: false) ⇒ Array<OpenSSL::X509::Certificate>
private
Load CA certs from the configured
capath. -
#load_cacerts_from_pem(pem) ⇒ Array<OpenSSL::X509::Certificate>
private
Load PEM encoded CA certificates.
-
#load_client_cert(name, required: false) ⇒ OpenSSL::X509::Request
private
Load a named client cert from the configured
certdir. -
#load_client_cert_from_pem(pem) ⇒ OpenSSL::X509::Certificate
private
Load a PEM encoded certificate.
-
#load_crls(required: false) ⇒ Array<OpenSSL::X509::CRL>
private
Load CRLs from the configured
crlpathpath. -
#load_crls_from_pem(pem) ⇒ Array<OpenSSL::X509::CRL>
private
Load PEM encoded CRL(s).
-
#load_private_key(name, required: false, password: nil) ⇒ OpenSSL::PKey::RSA, OpenSSL::PKey::EC
private
Load a private key from the configured
privatekeydir. -
#load_private_key_from_pem(pem, password: nil) ⇒ OpenSSL::PKey::RSA, OpenSSL::PKey::EC
private
Load a PEM encoded private key.
-
#load_private_key_password ⇒ String?
private
Load the private key password.
-
#load_request(name) ⇒ OpenSSL::X509::Request
private
Load a named certificate signing request (CSR) from the configured
requestdir. -
#load_request_from_pem(pem) ⇒ OpenSSL::X509::Request
private
Load a PEM encoded certificate signing request (CSR).
-
#save_cacerts(certs) ⇒ Object
private
Save
certsto the configuredcapath. -
#save_client_cert(name, cert) ⇒ Object
private
Save a named client cert to the configured
certdir. -
#save_crls(crls) ⇒ Object
private
Save
crlsto the configuredcrlpath. -
#save_private_key(name, key, password: nil) ⇒ Object
private
Save named private key in the configured
privatekeydir. -
#save_request(name, csr) ⇒ Object
private
Save a certificate signing request (CSR) to the configured
requestdir.
Methods included from PemStore
#delete_pem, #load_pem, #save_pem
Constructor Details
#initialize(capath: Puppet[:localcacert], crlpath: Puppet[:hostcrl], privatekeydir: Puppet[:privatekeydir], certdir: Puppet[:certdir], requestdir: Puppet[:requestdir], hostprivkey: Puppet.settings.set_by_config?(:hostprivkey) ? Puppet[:hostprivkey] : nil, hostcert: Puppet.settings.set_by_config?(:hostcert) ? Puppet[:hostcert] : nil) ⇒ CertProvider
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of CertProvider.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/puppet/x509/cert_provider.rb', line 20 def initialize(capath: Puppet[:localcacert], crlpath: Puppet[:hostcrl], privatekeydir: Puppet[:privatekeydir], certdir: Puppet[:certdir], requestdir: Puppet[:requestdir], hostprivkey: Puppet.settings.set_by_config?(:hostprivkey) ? Puppet[:hostprivkey] : nil, hostcert: Puppet.settings.set_by_config?(:hostcert) ? Puppet[:hostcert] : nil) @capath = capath @crlpath = crlpath @privatekeydir = privatekeydir @certdir = certdir @requestdir = requestdir @hostprivkey = hostprivkey @hostcert = hostcert end |
Instance Method Details
#ca_last_update ⇒ Time?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return the time when the CA bundle was last updated.
156 157 158 159 160 161 |
# File 'lib/puppet/x509/cert_provider.rb', line 156 def ca_last_update stat = Puppet::FileSystem.stat(@capath) Time.at(stat.mtime) rescue Errno::ENOENT nil end |
#ca_last_update=(time) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set the CA bundle last updated time.
168 169 170 |
# File 'lib/puppet/x509/cert_provider.rb', line 168 def ca_last_update=(time) Puppet::FileSystem.touch(@capath, mtime: time) end |
#create_request(name, private_key) ⇒ Puppet::X509::Request
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Create a certificate signing request (CSR).
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 |
# File 'lib/puppet/x509/cert_provider.rb', line 301 def create_request(name, private_key) = {} if Puppet[:dns_alt_names] && Puppet[:dns_alt_names] != '' [:dns_alt_names] = Puppet[:dns_alt_names] end csr_attributes = Puppet::SSL::CertificateRequestAttributes.new(Puppet[:csr_attributes]) if csr_attributes.load [:csr_attributes] = csr_attributes.custom_attributes [:extension_requests] = csr_attributes.extension_requests end csr = Puppet::SSL::CertificateRequest.new(name) csr.generate(private_key, ) end |
#crl_last_update ⇒ Time?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return the time when the CRL was last updated.
134 135 136 137 138 139 |
# File 'lib/puppet/x509/cert_provider.rb', line 134 def crl_last_update stat = Puppet::FileSystem.stat(@crlpath) Time.at(stat.mtime) rescue Errno::ENOENT nil end |
#crl_last_update=(time) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set the CRL last updated time.
146 147 148 |
# File 'lib/puppet/x509/cert_provider.rb', line 146 def crl_last_update=(time) Puppet::FileSystem.touch(@crlpath, mtime: time) end |
#delete_request(name) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Delete a named certificate signing request (CSR) from the configured requestdir.
354 355 356 357 358 359 |
# File 'lib/puppet/x509/cert_provider.rb', line 354 def delete_request(name) path = to_path(@requestdir, name) delete_pem(path) rescue SystemCallError => e raise Puppet::Error.new(_("Failed to delete certificate request for '%{name}'") % {name: name}, e) end |
#load_cacerts(required: false) ⇒ Array<OpenSSL::X509::Certificate>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load CA certs from the configured capath.
56 57 58 59 60 61 62 63 64 |
# File 'lib/puppet/x509/cert_provider.rb', line 56 def load_cacerts(required: false) pem = load_pem(@capath) if !pem && required raise Puppet::Error, _("The CA certificates are missing from '%{path}'") % { path: @capath } end pem ? load_cacerts_from_pem(pem) : nil rescue SystemCallError => e raise Puppet::Error.new(_("Failed to load CA certificates from '%{capath}'") % {capath: @capath}, e) end |
#load_cacerts_from_pem(pem) ⇒ Array<OpenSSL::X509::Certificate>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load PEM encoded CA certificates.
73 74 75 76 77 78 79 80 |
# File 'lib/puppet/x509/cert_provider.rb', line 73 def load_cacerts_from_pem(pem) # TRANSLATORS 'PEM' is an acronym and shouldn't be translated raise OpenSSL::X509::CertificateError, _("Failed to parse CA certificates as PEM") if pem !~ CERT_DELIMITERS pem.scan(CERT_DELIMITERS).map do |text| OpenSSL::X509::Certificate.new(text) end end |
#load_client_cert(name, required: false) ⇒ OpenSSL::X509::Request
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load a named client cert from the configured certdir.
272 273 274 275 276 277 278 279 280 281 |
# File 'lib/puppet/x509/cert_provider.rb', line 272 def load_client_cert(name, required: false) path = @hostcert || to_path(@certdir, name) pem = load_pem(path) if !pem && required raise Puppet::Error, _("The client certificate is missing from '%{path}'") % { path: path } end pem ? load_client_cert_from_pem(pem) : nil rescue SystemCallError => e raise Puppet::Error.new(_("Failed to load client certificate for '%{name}'") % {name: name}, e) end |
#load_client_cert_from_pem(pem) ⇒ OpenSSL::X509::Certificate
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load a PEM encoded certificate.
290 291 292 |
# File 'lib/puppet/x509/cert_provider.rb', line 290 def load_client_cert_from_pem(pem) OpenSSL::X509::Certificate.new(pem) end |
#load_crls(required: false) ⇒ Array<OpenSSL::X509::CRL>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load CRLs from the configured crlpath path.
102 103 104 105 106 107 108 109 110 |
# File 'lib/puppet/x509/cert_provider.rb', line 102 def load_crls(required: false) pem = load_pem(@crlpath) if !pem && required raise Puppet::Error, _("The CRL is missing from '%{path}'") % { path: @crlpath } end pem ? load_crls_from_pem(pem) : nil rescue SystemCallError => e raise Puppet::Error.new(_("Failed to load CRLs from '%{crlpath}'") % {crlpath: @crlpath}, e) end |
#load_crls_from_pem(pem) ⇒ Array<OpenSSL::X509::CRL>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load PEM encoded CRL(s).
119 120 121 122 123 124 125 126 |
# File 'lib/puppet/x509/cert_provider.rb', line 119 def load_crls_from_pem(pem) # TRANSLATORS 'PEM' is an acronym and shouldn't be translated raise OpenSSL::X509::CRLError, _("Failed to parse CRLs as PEM") if pem !~ CRL_DELIMITERS pem.scan(CRL_DELIMITERS).map do |text| OpenSSL::X509::CRL.new(text) end end |
#load_private_key(name, required: false, password: nil) ⇒ OpenSSL::PKey::RSA, OpenSSL::PKey::EC
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load a private key from the configured privatekeydir. For historical reasons, names are case-insensitive.
209 210 211 212 213 214 215 216 217 218 |
# File 'lib/puppet/x509/cert_provider.rb', line 209 def load_private_key(name, required: false, password: nil) path = @hostprivkey || to_path(@privatekeydir, name) pem = load_pem(path) if !pem && required raise Puppet::Error, _("The private key is missing from '%{path}'") % { path: path } end pem ? load_private_key_from_pem(pem, password: password) : nil rescue SystemCallError => e raise Puppet::Error.new(_("Failed to load private key for '%{name}'") % {name: name}, e) end |
#load_private_key_from_pem(pem, password: nil) ⇒ OpenSSL::PKey::RSA, OpenSSL::PKey::EC
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load a PEM encoded private key.
230 231 232 233 234 235 |
# File 'lib/puppet/x509/cert_provider.rb', line 230 def load_private_key_from_pem(pem, password: nil) # set a non-nil password to ensure openssl doesn't prompt password ||= '' OpenSSL::PKey.read(pem, password) end |
#load_private_key_password ⇒ String?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load the private key password.
243 244 245 246 247 |
# File 'lib/puppet/x509/cert_provider.rb', line 243 def load_private_key_password Puppet::FileSystem.read(Puppet[:passfile], :encoding => Encoding::BINARY) rescue Errno::ENOENT nil end |
#load_request(name) ⇒ OpenSSL::X509::Request
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load a named certificate signing request (CSR) from the configured requestdir.
340 341 342 343 344 345 346 |
# File 'lib/puppet/x509/cert_provider.rb', line 340 def load_request(name) path = to_path(@requestdir, name) pem = load_pem(path) pem ? load_request_from_pem(pem) : nil rescue SystemCallError => e raise Puppet::Error.new(_("Failed to load certificate request for '%{name}'") % {name: name}, e) end |
#load_request_from_pem(pem) ⇒ OpenSSL::X509::Request
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Load a PEM encoded certificate signing request (CSR).
368 369 370 |
# File 'lib/puppet/x509/cert_provider.rb', line 368 def load_request_from_pem(pem) OpenSSL::X509::Request.new(pem) end |
#save_cacerts(certs) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Save certs to the configured capath.
42 43 44 45 46 |
# File 'lib/puppet/x509/cert_provider.rb', line 42 def save_cacerts(certs) save_pem(certs.map(&:to_pem).join, @capath, **(:localcacert)) rescue SystemCallError => e raise Puppet::Error.new(_("Failed to save CA certificates to '%{capath}'") % {capath: @capath}, e) end |
#save_client_cert(name, cert) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Save a named client cert to the configured certdir.
256 257 258 259 260 261 |
# File 'lib/puppet/x509/cert_provider.rb', line 256 def save_client_cert(name, cert) path = @hostcert || to_path(@certdir, name) save_pem(cert.to_pem, path, **(:hostcert)) rescue SystemCallError => e raise Puppet::Error.new(_("Failed to save client certificate for '%{name}'") % {name: name}, e) end |
#save_crls(crls) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Save crls to the configured crlpath.
88 89 90 91 92 |
# File 'lib/puppet/x509/cert_provider.rb', line 88 def save_crls(crls) save_pem(crls.map(&:to_pem).join, @crlpath, **(:hostcrl)) rescue SystemCallError => e raise Puppet::Error.new(_("Failed to save CRLs to '%{crlpath}'") % {crlpath: @crlpath}, e) end |
#save_private_key(name, key, password: nil) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Save named private key in the configured privatekeydir. For historical reasons, names are case insensitive.
183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/puppet/x509/cert_provider.rb', line 183 def save_private_key(name, key, password: nil) pem = if password cipher = OpenSSL::Cipher::AES.new(128, :CBC) key.export(cipher, password) else key.to_pem end path = @hostprivkey || to_path(@privatekeydir, name) save_pem(pem, path, **(:hostprivkey)) rescue SystemCallError => e raise Puppet::Error.new(_("Failed to save private key for '%{name}'") % {name: name}, e) end |
#save_request(name, csr) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Save a certificate signing request (CSR) to the configured requestdir.
325 326 327 328 329 330 |
# File 'lib/puppet/x509/cert_provider.rb', line 325 def save_request(name, csr) path = to_path(@requestdir, name) save_pem(csr.to_pem, path, **(:hostcsr)) rescue SystemCallError => e raise Puppet::Error.new(_("Failed to save certificate request for '%{name}'") % {name: name}, e) end |