Nowy serwer nie może pobrać konfiguracji z Puppetmaster z powodu błędu ssl

14

Trzy maszyny w środowisku produkcyjnym miały pewne problemy ze sprzętem i zostały wycofane z eksploatacji. Zespół infrastruktury zainstalował je ponownie i nadał im te same nazwy hostów i adresy IP. Celem jest uruchomienie Puppet na tych systemach, aby można je było ponownie uruchomić.


Próba

1) Stare certyfikaty Puppet zostały usunięte z Puppetmaster, wydając następujące polecenia:

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

2) Po usunięciu starego certyfikatu utworzono nowe żądanie certyfikatu, wydając następujące polecenie z jednego z ponownie zainstalowanych węzłów:

[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) Gdy żądanie certyfikatu było widoczne w Puppetmaster, wydano następującą komendę, aby podpisać prośbę o certyfikat:

[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

Po podpisaniu żądania certyfikatu i rozpoczęciu biegu Puppet generowany jest następujący błąd:

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

Uruchomienie Puppet po raz drugi powoduje:

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

Analiza

Aby rozwiązać problem, zbadano komunikat o błędzie i wygląda na to, że problem dotyczy protokołu SSL lub Puppet. Być może jeden z tych pakietów został zainstalowany niepoprawnie lub w przeinstalowanym węźle zainstalowano niewłaściwą wersję.

Marionetka

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

Nie znaleziono rozbieżności między pakietami SSL i Puppet zainstalowanymi na różnych serwerach. Systemy, które nie zostały wycofane z eksploatacji ani ponownie zainstalowane, nadal mogą uruchamiać Puppet. Problem jest ograniczony do przeinstalowanego serwera. Pamiętaj, że Puppet nie został uruchomiony na dwóch pozostałych przeinstalowanych serwerach. Co powoduje ten problem i jak go rozwiązać?

Itai Ganot
źródło
1
Eh Odwołałeś certyfikaty, ale lista CRL nie została jeszcze zaktualizowana. Czy wydałeś także nowe certyfikaty?
Deer Hunter
Jeśli dobrze rozumiem ten proces, to przy pierwszym puppet agent -turuchomieniu na kliencie tworzy on certyfikat i wysyłam go do zatwierdzenia przez puppetmastera, więc jeśli to właściwy sposób wydawania nowych certyfikatów, to zrobiłem to.
Itai Ganot
@ItaiGanot Rzeczywiście, ale czasami niektóre stare lub nieaktualne certyfikaty, które znajdują się w / var / lib / puppet / ssl na agencie, powodują konflikt
030
Wystąpił ten sam błąd msg. Inną sprawą do sprawdzenia jest to, czy 2. żądanie pokazuje to samo fqdn co węzeł. To żądanie pokazuje fqdn kukiełkowego mistrza.
gość

Odpowiedzi:

20

Zwięzła odpowiedź

Problem CRL is not yet valid forwskazuje, że czas między agentem marionetkowym a mistrzem marionetek nie jest zsynchronizowany . Synchronizuj czas (NTP). Usuń certyfikat również z Puppet-agent i Puppetmaster, a następnie uruchom Puppet na agencie.


Kompleksowa odpowiedź

CRL is not yet valid for znajduje się w następującym fragmencie.

Poniższy kod testowy fragment opisuje, co powoduje ten problem:

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

Przedmiot

subject do
  described_class.new(ssl_configuration,
  ssl_host)
end

Kod zawiera fragmenty z klasy OpenSSL :: X509 :: CRL .

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

Czas ostatniej aktualizacji będzie bieżącym czasem plus dodatkowy dzień i zostanie przekazany do funkcji podmiotu, która wywołuje funkcję wywołania, która znajduje się w klasie 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

Jeśli parametr preverify_ok ma wartość false, zastosowanie ma klauzula else. Ponieważ if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSwynikiem jest fałsz, ponieważ czas został skasowany z dodatkowym dniem, zastosowanie będzie miała instrukcja else. Ocena @verify_errors << "#{error_string} for #{crl.issuer}"wyników w CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Aby rozwiązać problem:

  1. Zsynchronizuj czas między agentem marionetkowym a mistrzem marionetek. Czy serwer NTP działa (dobrze) na obu węzłach?
  2. Usuń lub zmień nazwę całego folderu ssl ( / var / lib / puppet / ssl ) od agenta.
  3. Odwołaj certyfikat od kapitana, wydając sudo puppet cert clean <fqdn-puppet-agent>
  4. Podpisz certyfikat, jeśli autosign jest wyłączony
  5. Uruchom marionetkę na agencie

Podsumowując, czas na Puppet-agentów i Puppetmaster powinien być zsynchronizowany przez cały czas. Przekroczenie maksymalnego dopuszczalnego odchylenia 5 minut spowoduje problem.

030
źródło
Nadal otrzymuję to: "[root @ grb16 ~] # agent marionetkowy -t Informacje: Buforowanie certyfikatu dla grb16.company.com Informacje: Buforowanie lista_rejestracji certyfikatów dla ca Błąd: Nie można zażądać certyfikatu: zwrócono połączenie SSL = 1 errno = 0 stan = SSLv3 odczytać certyfikat serwera B: weryfikacja certyfikatu nie powiodła się: [CRL nie jest jeszcze ważny dla / CN = Puppet CA: foreman.company.com] Wyjście; nie udało się pobrać certyfikatu i kelner jest wyłączony
Itai Ganot
@ItaiGanot Ok. Usunięto / var / lib / puppet / ssl. Cert usunięty z Puppetmaster. Czy mógłbyś sprawdzić, czy agent łączy się z właściwym lalkowcem?
030
Robi: [root @ grb16 ~] # serwer grep /etc/puppet/puppet.conf serwer =
foreman.company.com
1
Jesteś mężczyzną! głuptasie, zapomniałem edytować strefy czasowej maszyny. Wielkie dzięki!
Itai Ganot
1
Też miałem ten problem. Okazuje się, że musiałem zrestartować ntp w moim węźle:systemctl restart ntpd
Red Cricket
2

Wpadłem na ten sam problem.

Nasza konfiguracja lalek jest kontrolowana w wersji za pomocą GitHub, więc za każdym razem, gdy zapewniamy nowego lalekmistrza, napotykamy problemy z certyfikatami. Zwykle puppet ca --clean --alldziała, ale znaleźliśmy następujące bardziej niezawodne:

rm -rf $(puppet master --configprint ssldir)
Mike Purcell
źródło