it-swarm.com.de

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

Drei Maschinen in der Produktionsumgebung hatten einige Hardwareprobleme und wurden außer Betrieb genommen. 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 wieder in Betrieb genommen werden können.


Versuch

1) Die alten Puppet-Zertifikate wurden vom Puppetmaster entfernt, indem die folgenden Befehle ausgegeben wurden:

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:

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

3) Sobald die Zertifikatanforderung auf dem Puppetmaster sichtbar war, wurde der folgende Befehl ausgegeben, um die Zertifikatanforderung zu signieren:

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

Problem

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

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

Das zweite Ausführen von Puppet führt zu:

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

Analyse

Um das Problem zu lösen, wurde die Fehlermeldung untersucht und es sieht so aus, als ob das Problem mit SSL oder Puppet zusammenhängt. Möglicherweise wurde eines dieser Pakete falsch installiert oder eine falsche Version wurde auf dem neu installierten Knoten installiert.

Marionette

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

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

Es wurden keine Diskrepanzen zwischen den SSL- und Puppet-Paketen gefunden, die auf verschiedenen Servern installiert sind. Auf den Systemen, die nicht außer Betrieb genommen oder neu installiert wurden, kann Puppet weiterhin ausgeführt werden. 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 gelöst werden?

14
Itai Ganot

Kurze Antwort

Die Angelegenheit CRL is not yet valid for gibt an, dass die Zeit zwischen dem Puppet-Agenten und dem Puppetmaster nicht synchron ist . Synchronisieren Sie die Zeit (NTP). Entfernen Sie das Zertifikat auch vom Puppet-Agenten 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

subject

subject do
  described_class.new(ssl_configuration,
  ssl_Host)
end

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

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 last_updated Zeit ist die aktuelle Zeit plus ein zusätzlicher Tag und wird an die Betrefffunktion übergeben, die die Aufruffunktion aufruft, die sich in der default_validator class .

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. Wie if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS führt zu false, da die Zeit mit einem zusätzlichen Tag versehen wurde. Die else-Anweisung ist anwendbar. Die Bewertung von @verify_errors << "#{error_string} for #{crl.issuer}" ergibt 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 Server NTP) 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 Sudo puppet cert clean <fqdn-puppet-agent>
  4. Signieren Sie das Zertifikat, wenn das automatische Signieren deaktiviert ist
  5. Führen Sie die Marionette auf dem Agenten aus

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

20
030

Bin auf das gleiche Problem gestoßen.

Unser Puppen-Setup wird mit GitHub versioniert. Jedes Mal, wenn wir einen neuen Puppenmeister bereitstellen, treten Zertifizierungsprobleme auf. Normalerweise puppet ca --clean --all funktioniert, aber wir haben Folgendes für zuverlässiger befunden:

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