Nuovo server impossibile recuperare la configurazione da Puppetmaster a causa di un errore ssl


14

Tre macchine nell'ambiente di produzione presentavano alcuni problemi hardware e sono state ritirate. Il team dell'infrastruttura li ha reinstallati e ha assegnato loro gli stessi nomi host e indirizzi IP. L'obiettivo è far funzionare Puppet su questi sistemi in modo che possano essere nuovamente messi in servizio.


Tentativo

1) I vecchi certificati Puppet sono stati rimossi da Puppetmaster emettendo i seguenti comandi:

puppet cert revoke grb16.company.com
puppet cert clean grb16.company.com

2) Una volta rimosso il vecchio certificato, è stata creata una nuova richiesta di certificato emettendo il seguente comando da uno dei nodi reinstallati:

[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) Una volta che la richiesta di certificato era visibile su Puppetmaster, il seguente comando è stato emesso per firmare la richiesta di certificato:

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

Problema

Dopo che la richiesta di certificato è stata firmata ed è stata avviata l'esecuzione di una marionetta, viene generato il seguente errore:

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

L'esecuzione di Puppet per la seconda volta comporta:

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

Analisi

Per risolvere il problema, il messaggio di errore è stato esaminato e sembra che il problema sia legato a SSL o Puppet. Forse uno di questi pacchetti è stato installato in modo errato o è stata installata una versione errata sul nodo reinstallato.

Fantoccio

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

Non sono state rilevate discrepanze tra i pacchetti SSL e Puppet installati su vari server. I sistemi che non sono stati disattivati ​​o reinstallati sono ancora in grado di eseguire Puppet. Il problema è limitato al server reinstallato. Si noti che Puppet non è stato eseguito sugli altri due server reinstallati. Cosa sta causando questo problema e come risolverlo?


1
Ehh. Hai revocato il certificato, ma il CRL non è ancora aggiornato. Hai emesso anche nuovi certificati?
Deer Hunter,

Se capisco correttamente il processo, quindi sul primo puppet agent -tche eseguo sul client crea il certificato e lo invia al burattinaio per l'approvazione, quindi se è il modo giusto di emettere nuovi certificati, allora l'ho fatto.
Itai Ganot,

@ItaiGanot In effetti, ma a volte alcuni certificati vecchi o obsoleti che risiedono in / var / lib / puppet / ssl sull'agente sono in conflitto
030

Ho riscontrato lo stesso messaggio di errore. Un'altra cosa da verificare è se la seconda richiesta mostra lo stesso fqdn del nodo. Che la richiesta mostri il fqdn del burattinaio.
ospite

Risposte:


20

Risposta concisa

Il problema CRL is not yet valid forindica che l'intervallo tra l'agente fantoccio e il fantoccio non è sincronizzato . Sincronizza l'ora (NTP). Rimuovere il certificato dall'agente fantoccio e anche dal burattinaio ed eseguire Puppet sull'agente.


Risposta completa

CRL is not yet valid for risiede nel frammento seguente.

Il frammento di codice di prova seguente descrive le cause del problema:

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

soggetto

subject do
  described_class.new(ssl_configuration,
  ssl_host)
end

Il codice include frammenti della classe OpenSSL :: X509 :: CRL .

emittente = (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' ora dell'ultimo aggiornamento sarà l'ora corrente più un giorno aggiuntivo e verrà passata alla funzione soggetto che chiama la funzione di chiamata che risiede nella 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

Se preverify_ok è falso, è applicabile la clausola else. Come if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSrisulta falso perché il tempo è stato cancellato con un giorno aggiuntivo l'istruzione else sarà applicabile. La valutazione dei @verify_errors << "#{error_string} for #{crl.issuer}"risultati in CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Per risolvere il problema:

  1. Sincronizza il tempo tra l'agente fantoccio e il burattinaio. Il server NTP funziona (bene) su entrambi i nodi?
  2. Rimuovere o rinominare la cartella ssl completa ( / var / lib / puppet / ssl ) dall'agente.
  3. Revoca il certificato dal master emettendo sudo puppet cert clean <fqdn-puppet-agent>
  4. Firma il certificato se la firma automatica è disabilitata
  5. Esegui il burattino sull'agente

In conclusione, il tempo su Puppet-agent e Puppetmaster dovrebbe essere sempre sincronizzato. Il superamento della deviazione massima consentita di 5 minuti causerà il problema.


Ricevo ancora questo: "[root @ grb16 ~] # agente fantoccio -t Informazioni: certificato di memorizzazione nella cache per grb16.company.com Informazioni: memorizzazione nella cache certificate_revocation_list per ca Errore: Impossibile richiedere il certificato: SSL_connect restituito = 1 errno = 0 stato = SSLv3 leggere il certificato del server B: verifica del certificato non riuscita: [CRL non è ancora valido per / CN = Puppet CA: foreman.company.com] Uscita; impossibile recuperare il certificato e waitforcert è disabilitato
Itai Ganot,

@ItaiGanot Ok. / var / lib / puppet / ssl rimosso. Cert rimosso da Puppetmaster. Potresti verificare se l'agente si connette al burattinaio giusto?
030,

Lo fa: [root @ grb16 ~] # grep server /etc/puppet/puppet.conf server = foreman.company.com
Itai Ganot,

1
Tu sei l'uomo! stupidami, ho dimenticato di modificare il fuso orario della macchina. Molte grazie!
Itai Ganot,

1
Ho avuto anche questo problema. Si scopre che dovevo riavviare ntp sul mio nodo:systemctl restart ntpd
Red Cricket,

2

Ho affrontato lo stesso problema.

La nostra configurazione delle marionette è controllata dalla versione tramite GitHub, quindi ogni volta che eseguiamo il provisioning di un nuovo burattinaio, incontriamo problemi di certificazione. Normalmente puppet ca --clean --allfunziona, ma abbiamo trovato quanto segue più affidabile:

rm -rf $(puppet master --configprint ssldir)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.