Neuer Server kann aufgrund eines SSL-Fehlers keine Konfiguration von Puppetmaster abrufen

13

Drei Maschinen in der Produktionsumgebung hatten einige Hardwareprobleme und wurden stillgelegt. Das Infrastruktur-Team hat sie neu installiert und ihnen dieselben Hostnamen und IP-Adressen zugewiesen. Ziel ist es, Puppet auf diesen Systemen auszuführen, damit diese erneut in Betrieb genommen werden können.


Versuch

1) Die alten Puppet-Zertifikate wurden mit den folgenden Befehlen vom Puppetmaster entfernt:

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

2) Nachdem das alte Zertifikat entfernt wurde, wurde eine neue Zertifikatanforderung erstellt, indem der folgende Befehl von einem der neu installierten Knoten ausgegeben wurde:

[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) Sobald die Zertifikatsanforderung auf dem Puppetmaster sichtbar war, wurde der folgende Befehl ausgegeben, um die Zertifikatsanforderung zu signieren:

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

Problem

Nachdem die Zertifikatsanforderung signiert und ein Puppet-Lauf gestartet wurde, wird der folgende Fehler ausgegeben:

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

Wenn Sie Puppet zum zweiten Mal ausführen, erhalten Sie:

[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

Um das Problem zu beheben, wurde die Fehlermeldung untersucht und es scheint, dass das Problem mit SSL oder Puppet zusammenhängt. Möglicherweise wurde eines dieser Pakete falsch installiert, oder auf dem neu installierten Knoten wurde eine falsche Version installiert.

Marionette

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

Es wurden keine Diskrepanzen zwischen den auf verschiedenen Servern installierten SSL- und Puppet-Paketen gefunden. Die Systeme, die nicht außer Betrieb genommen oder neu installiert wurden, können Puppet weiterhin ausführen. Das Problem ist auf den neu installierten Server beschränkt. Beachten Sie, dass Puppet auf den beiden anderen neu installierten Servern nicht ausgeführt wurde. Was verursacht dieses Problem und wie kann es behoben werden?

Itai Ganot
quelle
1
Ehh. Sie haben die Zertifikate widerrufen, die CRL wurde jedoch noch nicht aktualisiert. Haben Sie auch neue Zertifikate ausgestellt?
Deer Hunter
Wenn ich den Prozess richtig verstehe, wird beim ersten puppet agent -tAusführen auf dem Client das Zertifikat erstellt und zur Genehmigung an den Puppenmeister gesendet. Wenn dies der richtige Weg ist, neue Zertifikate auszustellen, habe ich dies getan.
Itai Ganot
@ItaiGanot In der Tat, aber manchmal sind einige alte oder veraltete Zertifikate, die sich in / var / lib / puppet / ssl auf dem Agenten befinden, widersprüchlich
030
Ich bin auf die gleiche Fehlermeldung gestoßen. Eine andere zu überprüfende Sache ist, ob die 2. Anfrage den gleichen fqdn wie der Knoten zeigt. Dass die Anfrage den fqdn des Puppenmeisters zeigt.
Gast

Antworten:

19

Kurze Antwort

Das Problem CRL is not yet valid forweist darauf hin, dass die Zeit zwischen Puppet-Agent und Puppetmaster nicht synchron ist . Synchronisieren Sie die Zeit (NTP). Entfernen Sie das Zertifikat auch vom Puppet-Agent und Puppetmaster und führen Sie Puppet auf dem Agenten aus.


Umfassende Antwort

CRL is not yet valid for befindet sich im folgenden Snippet.

Das folgende Testcode-Snippet beschreibt, was das Problem verursacht:

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

Gegenstand

subject do
  described_class.new(ssl_configuration,
  ssl_host)
end

Der Code enthält Snippets aus der OpenSSL :: X509 :: CRL- Klasse.

Emittent = (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;
}

Die letzte_aktualisierte Zeit ist die aktuelle Zeit plus ein zusätzlicher Tag und wird an die Betreff-Funktion übergeben, die die Aufruffunktion aufruft, die sich in der Klasse default_validator befindet .

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

Wenn preverify_ok false ist, gilt die else-Klausel. Da if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSsich false ergibt, weil die Zeit um einen weiteren Tag verkürzt wurde, gilt die else-Anweisung. Die Auswertung der @verify_errors << "#{error_string} for #{crl.issuer}"Ergebnisse in CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Um das Problem zu lösen:

  1. Synchronisiere die Zeit zwischen dem Puppenagenten und dem Puppenmeister. Läuft der NTP-Server auf beiden Knoten (gut)?
  2. Entfernen Sie den vollständigen SSL-Ordner ( / var / lib / puppet / ssl ) vom Agenten oder benennen Sie ihn um .
  3. Widerrufen Sie das Zertifikat vom Master, indem Sie es ausstellen sudo puppet cert clean <fqdn-puppet-agent>
  4. Signieren Sie das Zertifikat, wenn das automatische Signieren deaktiviert ist
  5. Führen Sie eine Marionette auf den Agenten aus

Abschließend sollte die Zeit auf Puppet-Agenten und Puppetmaster die ganze Zeit synchronisiert werden. Das Überschreiten der maximal zulässigen Abweichung von 5 Minuten führt zu dem Problem.

030
quelle
Ich erhalte weiterhin Folgendes: "[root @ grb16 ~] # puppet agent -t Info: Zertifikat für grb16.company.com zwischenspeichern Serverzertifikat B lesen: Zertifikatsüberprüfung fehlgeschlagen: [CRL ist noch nicht gültig für / CN = Puppet CA: foreman.company.com] Beenden, Zertifikat konnte nicht abgerufen werden und waitforcert ist deaktiviert
Itai Ganot
@ItaiGanot Ok. / var / lib / puppet / ssl entfernt. Cert von Puppetmaster entfernt. Könnten Sie überprüfen, ob der Agent eine Verbindung zum richtigen Puppenspieler herstellt?
030
Es macht: [root @ grb16 ~] # grep server /etc/puppet/puppet.conf server = foreman.company.com
Itai Ganot
1
Du bist der Mann! dumm mich, vergessen, die Zeitzone der Maschine zu bearbeiten. Vielen Dank!
Itai Ganot
1
Ich hatte auch dieses Problem. Es stellte sich heraus, dass ich ntp auf meinem Knoten neu starten musste:systemctl restart ntpd
Red Cricket
2

Bin auf dasselbe Problem gestoßen.

Unser Puppensetup wird mithilfe von GitHub versionsgesteuert. Jedes Mal, wenn wir einen neuen Puppenspieler bereitstellen, treten Zertifizierungsprobleme auf. Funktioniert normalerweise puppet ca --clean --all, aber wir haben festgestellt, dass Folgendes zuverlässiger ist:

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