Nouveau serveur incapable de récupérer la configuration de Puppetmaster en raison d'une erreur ssl

14

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 ~]# 

Une analyse

Afin de résoudre le problème, le message d'erreur a été étudié et il semble que le problème soit lié à SSL ou à Puppet. Peut-être l'un de ces packages a-t-il été installé de manière incorrecte ou une mauvaise version a été installée sur le nœud réinstallé.

Fantoche

[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?

Itai Ganot
la source
1
Ehh. Vous avez révoqué les certificats, mais la liste de révocation de certificats n'est pas encore mise à jour. Avez-vous également émis de nouveaux certificats?
Deer Hunter
Si je comprends bien le processus, le premier puppet agent -tque j'exécute sur le client crée le certificat et l'envoie au marionnettiste pour approbation, donc si c'est la bonne façon d'émettre de nouveaux certificats, je l'ai fait.
Itai Ganot
@ItaiGanot En effet, mais parfois certains certificats anciens ou obsolètes qui résident dans / var / lib / puppet / ssl sur l'agent sont en conflit
030
J'ai rencontré le même message d'erreur. Une autre chose à vérifier est de savoir si la 2e demande affiche le même fqdn que le nœud. Que la demande montre le nom de domaine du maître de marionnettes.
invité

Réponses:

20

Réponse concise

Le problème CRL is not yet valid forindique 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.

L' 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

matière

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 d'appel qui réside dans la 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. En tant que if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSfaux, car l'heure a été tronquée avec un jour supplémentaire, la déclaration else sera applicable. L'évaluation des @verify_errors << "#{error_string} for #{crl.issuer}"résultats en CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Afin de résoudre le problème:

  1. Synchronisez l'heure entre le Puppet-agent et le Puppetmaster. Le serveur NTP fonctionne-t-il (bien) sur les deux nœuds?
  2. Supprimez ou renommez le dossier ssl complet ( / var / lib / puppet / ssl ) de l'agent.
  3. Révoquer le certificat du maître en émettant sudo puppet cert clean <fqdn-puppet-agent>
  4. Signez le certificat si la signature automatique est désactivée
  5. Exécuter la marionnette sur l'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.

030
la source
J'obtiens toujours ceci: "[root @ grb16 ~] # agent de marionnettes -t Info: mise en cache du certificat pour grb16.company.com Info: mise en cache du certificat_revocation_list pour ca Erreur: impossible de demander le certificat: SSL_connect retourné = 1 errno = 0 état = SSLv3 lecture du certificat du serveur B: échec de la vérification du certificat: [CRL n'est pas encore valide pour / CN = Puppet CA: foreman.company.com] Sortie; échec de la récupération du certificat et waitforcert est désactivé
Itai Ganot
@ItaiGanot Ok. / var / lib / puppet / ssl supprimé. Cert retiré de Puppetmaster. Pourriez-vous vérifier si l'agent se connecte au bon marionnettiste?
030
Il le fait: [root @ grb16 ~] # grep server /etc/puppet/puppet.conf server = foreman.company.com
Itai Ganot
1
Tu es l'homme! idiot, j'ai oublié de modifier le fuseau horaire de la machine. Merci beaucoup!
Itai Ganot
1
J'ai eu ce problème également. Il s'avère que je devais redémarrer ntp sur mon nœud:systemctl restart ntpd
Red Cricket
2

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 provisionnons un nouveau marionnettiste, nous rencontrons des problèmes de cert. Fonctionne normalement puppet ca --clean --all, mais nous avons trouvé les éléments suivants plus fiables:

rm -rf $(puppet master --configprint ssldir)
Mike Purcell
la source