Trois machines de l'environnement de production ont rencontré des problèmes matériels et ont été mises hors service. L'équipe d'infrastructure les a réinstallés et leur a donné les mêmes noms d'hôte et adresses IP. L'objectif est d'exécuter Puppet sur ces systèmes afin qu'ils puissent être mis en service à nouveau.
Tentative
1) Les anciens certificats Puppet ont été supprimés du Puppetmaster en émettant les commandes suivantes:
puppet cert revoke grb16.company.com
puppet cert clean grb16.company.com
2) Une fois l'ancien certificat supprimé, une nouvelle demande de certificat a été créée en émettant la commande suivante à partir de l'un des nœuds réinstallés:
[root@grb16 ~]# puppet agent -t
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for grb16.company.com
Info: Certificate Request fingerprint (SHA256): 6F:2D:1D:71:67:18:99:86:2C:22:A1:14:80:55:34:35:FD:20:88:1F:36:ED:A7:7B:2A:12:09:4D:F8:EC:BF:6D
Exiting; no certificate found and waitforcert is disabled
[root@grb16 ~]#
3) Une fois la demande de certificat visible sur le Puppetmaster, la commande suivante a été émise pour signer la demande de certificat:
[root@foreman ~]# puppet cert sign grb16.company.com
Notice: Signed certificate request for grb16.company.com
Notice: Removing file Puppet::SSL::CertificateRequest grb16.company.com at '/var/lib/puppet/ssl/ca/requests/grb16.company.com.pem'
[root@foreman ~]#
Problème
Une fois la demande de certificat signée et une exécution de marionnettes lancée, l'erreur suivante est générée:
[root@grb16 ~]# puppet agent -t
Info: Caching certificate for grb16.company.com
Error: Could not request certificate: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Exiting; failed to retrieve certificate and waitforcert is disabled
[root@grb16 ~]#
Exécuter Puppet pour la deuxième fois se traduit par:
[root@grb16 ~]# puppet agent -t
Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Info: Retrieving pluginfacts
Error: /File[/var/lib/puppet/facts.d]: Failed to generate additional resources using 'eval_generate': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Error: /File[/var/lib/puppet/facts.d]: Could not evaluate: Could not retrieve file metadata for puppet://foreman.company.com/pluginfacts: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Wrapped exception:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Info: Retrieving plugin
Error: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Error: /File[/var/lib/puppet/lib]: Could not evaluate: Could not retrieve file metadata for puppet://foreman.company.com/plugins: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Wrapped exception:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Error: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
Error: Could not send report: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
[root@grb16 ~]#
Analyse
Afin de résoudre le problème, le message d'erreur a été examiné et il semble que le problème soit lié à SSL ou à Puppet. Peut-être que l'un de ces packages a été installé de manière incorrecte ou qu'une mauvaise version a été installée sur le nœud réinstallé.
Marionnette
[root@grb16 ~]# yum list installed |grep puppet
facter.x86_64 1:2.3.0-1.el6 @puppetlabs_6_products
hiera.noarch 1.3.4-1.el6 @puppetlabs_6_products
puppet.noarch 3.7.3-1.el6 @puppetlabs_6_products
puppetlabs-release.noarch
6-11 @puppetlabs_6_products
Ruby-augeas.x86_64 0.4.1-3.el6 @puppetlabs_6_deps
Ruby-shadow.x86_64 1:2.2.0-2.el6 @puppetlabs_6_deps
rubygem-json.x86_64 1.5.5-3.el6 @puppetlabs_6_deps
[~ # ~] ssl [~ # ~]
[root@grb16 ~]# yum list installed |grep ssl
nss_compat_ossl.x86_64 0.9.6-1.el6 @anaconda-CentOS-201410241409.x86_64/6.6
openssl.x86_64 1.0.1e-30.el6_6.4
openssl-devel.x86_64 1.0.1e-30.el6_6.4
[root@grb16 ~]#
Aucune différence n'a été trouvée entre les packages SSL et Puppet installés sur divers serveurs. Les systèmes qui n'ont pas été mis hors service ou réinstallés peuvent toujours exécuter Puppet. Le problème est limité au serveur réinstallé. Notez que Puppet n'a pas été exécuté sur les deux autres serveurs réinstallés. Quelle est la cause de ce problème et comment le résoudre?
Réponse concise
Le problème CRL is not yet valid for
indique que le temps entre le Puppet-agent et le Puppetmaster n'est pas synchronisé . Synchronisez l'heure (NTP). Supprimez également le certificat de Puppet-agent et Puppetmaster et exécutez Puppet sur l'agent.
Réponse complète
CRL is not yet valid for
réside dans l'extrait de code suivant.
Le extrait de code de test suivant décrit les causes du problème:
it 'includes the CRL issuer in the verify error message' do
crl = OpenSSL::X509::CRL.new
crl.issuer = OpenSSL::X509::Name.new([['CN','Puppet CA: puppetmaster.example.com']])
crl.last_update = Time.now + 24 * 60 * 60
ssl_context.stubs(:current_crl).returns(crl)
subject.call(false, ssl_context)
expect(subject.verify_errors).to eq(["CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com"])
end
ssl_context
let(:ssl_context) do
mock('OpenSSL::X509::StoreContext')
end
subject
subject do
described_class.new(ssl_configuration,
ssl_Host)
end
Le code inclut des extraits de la classe OpenSSL :: X509 :: CRL .
émetteur = (p1)
static VALUE
ossl_x509crl_set_issuer(VALUE self, VALUE issuer)
{
X509_CRL *crl;
GetX509CRL(self, crl);
if (!X509_CRL_set_issuer_name(crl, GetX509NamePtr(issuer))) { /* DUPs name */
ossl_raise(eX509CRLError, NULL);
}
return issuer;
}
last_update = (p1)
static VALUE
ossl_x509crl_set_last_update(VALUE self, VALUE time)
{
X509_CRL *crl;
time_t sec;
sec = time_to_time_t(time);
GetX509CRL(self, crl);
if (!X509_time_adj(crl->crl->lastUpdate, 0, &sec)) {
ossl_raise(eX509CRLError, NULL);
}
return time;
}
L'heure last_updated sera l'heure actuelle plus un jour supplémentaire et sera transmise à la fonction sujet qui appelle la fonction appel qui réside dans le classe default_validator .
class Puppet::SSL::Validator::DefaultValidator #< class Puppet::SSL::Validator
attr_reader :peer_certs
attr_reader :verify_errors
attr_reader :ssl_configuration
FIVE_MINUTES_AS_SECONDS = 5 * 60
def initialize(
ssl_configuration = Puppet::SSL::Configuration.new(
Puppet[:localcacert], {
:ca_auth_file => Puppet[:ssl_client_ca_auth]
}),
ssl_Host = Puppet::SSL::Host.localhost)
reset!
@ssl_configuration = ssl_configuration
@ssl_Host = ssl_Host
end
def call(preverify_ok, store_context)
if preverify_ok
...
else
...
crl = store_context.current_crl
if crl
if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS
...
else
@verify_errors << "#{error_string} for #{crl.issuer}"
end
...
end
end
end
Si preverify_ok est faux, la clause else est applicable. Comme if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS
renvoie false car l'heure a été tronquée avec un jour supplémentaire, la déclaration else sera applicable. L'évaluation de @verify_errors << "#{error_string} for #{crl.issuer}"
résulte en CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com
.
Afin de résoudre le problème:
Sudo puppet cert clean <fqdn-puppet-agent>
En conclusion, le temps sur Puppet-agents et Puppetmaster doit être synchronisé tout le temps. Le dépassement de l'écart maximal autorisé de 5 minutes entraînera le problème.
Ran dans le même problème.
Notre configuration de marionnettes est contrôlée par la version à l'aide de GitHub, donc chaque fois que nous fournissons un nouveau maître de marionnettes, nous rencontrons des problèmes de cert. Normalement puppet ca --clean --all
fonctionne, mais nous avons trouvé les éléments suivants plus fiables:
rm -rf $(puppet master --configprint ssldir)