Три машины в продуктивной среде имели некоторые аппаратные проблемы и были выведены из эксплуатации. Рабочая группа обслуживания инфраструктуры переустановила их и дала им те же имена хостов и IP-адреса. Цель состоит в том, чтобы выполнить Марионетку в этих системах, таким образом, они могут быть уполномочены снова.
Попытка
1) Старые Марионеточные сертификаты были удалены из Puppetmaster путем выдачи следующих команд:
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) После того как запрос сертификата был видим на Puppetmaster, следующая команда была дана для подписания запроса сертификата:
[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 и Марионеточными пакетами, которые установлены на различных серверах. Системы, которые не были списаны или переустановлены, все еще могут выполнить Марионетку. Проблема ограничивается переустановленным сервером. Обратите внимание, что Марионетка не была выполнена на других двух переустановленных серверах. Что вызывает эту проблему и как решить ее?
Краткий ответ
Проблема CRL еще не действительна для
означает, что время между Puppet-agent и Puppetmaster не синхронизировано . Синхронизировать время (NTP). Удалите сертификат из Puppet-agent и Puppetmaster, а также запустите Puppet на агенте.
Полный ответ
CRL еще не действителен для
находится в следующем фрагменте.
следующий Фрагмент тестового кода описывает причину проблемы:
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
Код включает фрагменты из класса 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;
}
Время last_updated будет текущим временем плюс дополнительный день и будет передано в функцию-субъект, которая вызывает функцию вызова , которая находится в классе 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 имеет значение false, применимо условие else. Поскольку , если crl.last_update && crl.last_update
@verify_errors << "# {error_string} для # {crl.issuer}"
приводит к CRL еще не действителен для / CN = Puppet CA: puppetmaster.example.com
.
Для решения проблемы:
sudo puppet cert clean
В заключение, время на Puppet-agent и Puppetmaster должно быть постоянно синхронизировано. Превышение максимально допустимого отклонения в 5 минут вызовет проблему.
Возникла та же проблема.
Наша марионетка - это версия контролируется с помощью GitHub, поэтому каждый раз, когда мы предоставляем нового мастера марионеток, мы сталкиваемся с проблемами сертификата. Обычно puppet ca --clean --all
работает, но мы сочли следующие более надежными:
rm -rf $(puppet master --configprint ssldir)