web-dev-qa-db-fra.com

Le nouveau serveur n'a pas pu récupérer la configuration de Puppetmaster en raison d'une erreur SSL

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?

14
Itai Ganot

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:

  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évoquez 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.

20
030

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)
2
Mike Purcell