Новий сервер не зміг отримати конфігурацію у Puppetmaster через помилку ssl


14

Три машини у виробничому середовищі мали деякі технічні проблеми та були виведені з експлуатації. Команда інфраструктури перевстановила їх і надала їм однакові імена хостів та IP-адреси. Мета - запустити ляльку в цих системах, щоб їх можна було ввести знову.


Спроба

1) Старі сертифікати ляльок були видалені з лялькового майстра, видавши наступні команди:

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

2) Після видалення старого сертифіката створено новий запит сертифікату, видавши наступну команду з одного з перевстановлених вузлів:

[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) Після того, як запит на сертифікат був помітний на Ляльковому майстрі, для підписання запиту на сертифікат було видано таку команду:

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

Проблема

Після підписання запиту на сертифікат і запуску запуску ляльки видається наступна помилка:

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

Запуск лялечки вдруге призводить до:

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

Аналіз

Для вирішення проблеми повідомлення про помилку було досліджено, і схоже, що проблема пов’язана з SSL або лялькою. Можливо, один із цих пакетів був встановлений неправильно або неправильно встановлена ​​версія була встановлена ​​на перевстановленому вузлі.

Лялечка

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

Не було виявлено розбіжностей між пакетами SSL та Puppet, які встановлені на різних серверах. Системи, які не були виведені з експлуатації або перевстановлені, все ще можуть запускати Лялечку. Випуск обмежений перевстановленим сервером. Зауважте, що Лялька не запускалася на двох інших перевстановлених серверах. Що викликає це питання і як його вирішити?


1
Е-е. Ви скасували серти, але CRL ще не оновлено. Ви також видали нові серти?
Мисливець на оленів

Якщо я правильно розумію процес, тоді на першому, puppet agent -tякий я запускаю на клієнті, він створює сертифікат і надсилає його до лялькового майстра для затвердження, тож якщо це правильний спосіб видавати нові серти, то я це зробив.
Ітаї Ганот

@ItaiGanot Дійсно, але іноді деякі старі або застарілі сертифікати, що містять у / var / lib / puppet / ssl на агенті, суперечать один
одному

Я зіткнувся з тією ж помилкою msg. Інша річ, щоб перевірити, чи є у другому запиті такий же fqdn, що і вузол. Це запит показує fqdn лялькового майстра.
гість

Відповіді:


20

Коротка відповідь

Проблема CRL is not yet valid forвказує на те, що час між ляльковим агентом та ляльковим майстром не синхронізовано . Синхронізуйте час (NTP). Видаліть сертифікат також з лялькового агента та ляльковика та запустіть Лялечку на агенті.


Вичерпна відповідь

CRL is not yet valid for знаходиться в наступному фрагменті.

Наступний код тесту фрагмент коду описує те , що викликає питання:

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 do
  described_class.new(ssl_configuration,
  ssl_host)
end

Код включає фрагменти з класу OpenSSL :: X509 :: CRL .

емітент = (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;
}

Час останнього оновлення буде поточним часом плюс додатковий день і буде передано тематичній функції, яка викликає функцію виклику, що знаходиться в класі 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

Якщо помилка preverify_ok неправдива, застосовується інше. Як if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSрезультат, помилково, оскільки час було встановлено додатковим днем, інше буде застосовано. Оцінка @verify_errors << "#{error_string} for #{crl.issuer}"результатів у Росії CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Для вирішення питання:

  1. Синхронізуйте час між ляльковим агентом та ляльковим майстром. Чи працює сервер NTP (добре) на обох вузлах?
  2. Видаліть або перейменуйте повну папку ssl ( / var / lib / puppet / ssl ) з агента.
  3. Відкликати церт у майстра, видаючи sudo puppet cert clean <fqdn-puppet-agent>
  4. Підпишіть сертифікат, якщо автоматичний знак відключений
  5. Виконайте ляльку на агенті

На закінчення, час для лялькових агентів та Puppetmaster повинен синхронізуватися весь час. Перевищення максимально допустимого відхилення на 5 хвилин спричинить проблему.


Я все ще отримую це: "[root @ grb16 ~] # ляльковий агент -t інформація: сертифікат кешування для grb16.company.com Інформація: сертифікат кешування_revocation_list для ca Помилка: Не вдалося запитати сертифікат: SSL_connect return = 1 errno = 0 state = SSLv3 прочитати сертифікат сервера B: сертифікат верифікувати не вдалося: [CRL ще не є дійсним для / CN = Ляльковий CA: foreman.company.com] Вихід з режиму, не вдалося отримати сертифікат і waitforcert відключений
Ітай Ganot

@ItaiGanot Ок. / var / lib / puppet / ssl видалено. Серта видалено з Puppetmaster. Не могли б ви перевірити, чи підключається агент до правильного лялькового майстра?
030

Це так: [root @ grb16 ~] # grep server /etc/puppet/puppet.conf server = foreman.company.com
Itai Ganot

1
Ти людина! нерозумно мені, забув редагувати часовий пояс машини. Дуже дякую!
Itai Ganot

1
У мене теж була ця проблема. Виявляється, мені потрібно було перезапустити ntp на своєму вузлі:systemctl restart ntpd
Red Cricket

2

Побіг у тому ж випуску.

Наша лялькова установка контролюється версією за допомогою GitHub, тому кожен раз, коли ми надаємо нового лялькового майстра, ми стикаємося з проблемами cert. Зазвичай puppet ca --clean --allпрацює, але ми знайшли наступне більш надійне:

rm -rf $(puppet master --configprint ssldir)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.