Novo servidor incapaz de buscar a configuração do Puppetmaster devido a algum erro de SSL

14

Três máquinas no ambiente de produção tiveram alguns problemas de hardware e foram descomissionadas. A equipe de infraestrutura os reinstalou e forneceu os mesmos nomes de host e endereços IP. O objetivo é executar o Puppet nesses sistemas para que eles possam ser comissionados novamente.


Tentativa

1) Os antigos certificados Puppet foram removidos do Puppetmaster emitindo os seguintes comandos:

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

2) Depois que o certificado antigo foi removido, uma nova solicitação de certificado foi criada emitindo o seguinte comando de um dos nós reinstalados:

[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) Depois que a solicitação de certificado ficou visível no Puppetmaster, o seguinte comando foi emitido para assinar a solicitação de certificado:

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

Problema

Após a assinatura do pedido de certificado e a execução de uma marionete, o seguinte erro é gerado:

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

Executar o Puppet pela segunda vez resulta em:

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

Análise

Para resolver o problema, a mensagem de erro foi investigada e parece que o problema está relacionado ao SSL ou ao Puppet. Talvez um desses pacotes tenha sido instalado incorretamente ou uma versão errada tenha sido instalada no nó reinstalado.

Fantoche

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

Não foram encontradas discrepâncias entre os pacotes SSL e Puppet instalados em vários servidores. Os sistemas que não foram descomissionados ou reinstalados ainda podem executar o Puppet. O problema está restrito ao servidor reinstalado. Observe que o Puppet não foi executado nos outros dois servidores reinstalados. O que está causando esse problema e como resolvê-lo?

Itai Ganot
fonte
1
Ehh. Você revogou os certificados, mas a CRL ainda não foi atualizada. Você também emitiu novos certificados?
Deer Hunter
Se eu entendo o processo corretamente, então, no primeiro puppet agent -tque eu corro no cliente, ele cria o certificado e o envia ao puppetmaster para aprovação. Portanto, se esse é o caminho certo para emitir novos certificados, eu o fiz.
Itai Ganot
@ItaiGanot De fato, mas às vezes alguns certificados antigos ou desatualizados que residem em / var / lib / puppet / ssl no agente estão em conflito
030
Corri para o mesmo erro msg. Outra coisa a verificar é se a segunda solicitação mostra o mesmo fqdn que o nó. Que a solicitação mostre o fqdn do mestre de marionetes.
guest

Respostas:

20

Resposta concisa

O problema CRL is not yet valid forindica que o tempo entre o agente Puppet e o Puppetmaster está fora de sincronia . Sincronize a hora (NTP). Remova o certificado do Puppet-agent e do Puppetmaster também e execute o Puppet no agente.


Resposta abrangente

CRL is not yet valid for reside no seguinte snippet.

O seguinte snippet de código de teste descreve o que causa o problema:

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

sujeito

subject do
  described_class.new(ssl_configuration,
  ssl_host)
end

O código inclui trechos da classe OpenSSL :: X509 :: CRL .

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

O horário last_updated será o horário atual mais um dia adicional e será passado para a função de assunto que chama a função de chamada que reside na classe 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

Se preverify_ok for false, a cláusula else é aplicável. Como if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSresulta em false, porque o horário foi stubed com mais um dia, a instrução else será aplicável. A avaliação dos @verify_errors << "#{error_string} for #{crl.issuer}"resultados em CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Para resolver o problema:

  1. Sincronize o tempo entre o agente Puppet e o Puppetmaster. O servidor NTP é executado (bem) nos dois nós?
  2. Remova ou renomeie a pasta ssl completa ( / var / lib / puppet / ssl ) do agente.
  3. Revogar o certificado do mestre emitindo sudo puppet cert clean <fqdn-puppet-agent>
  4. Assine o certificado se a assinatura automática estiver desativada
  5. Executar fantoche no agente

Em conclusão, o tempo em Puppet-agents e Puppetmaster deve ser sincronizado o tempo todo. Exceder o desvio máximo permitido de 5 minutos causará o problema.

030
fonte
Ainda recebo o seguinte: "[root @ grb16 ~] # fantoche agente -t ​​Informações: certificado de cache para grb16.company.com Informações: cache de certificate_revocation_list para ca Erro: Não foi possível solicitar o certificado: SSL_connect retornado = 1 errno = 0 state = SSLv3 leia o certificado do servidor B: a verificação do certificado falhou: [A CRL ainda não é válida para / CN = CA Puppet: foreman.company.com] Saindo; falha ao recuperar o certificado e o waitforcert está desabilitado
Itai Ganot
@ItaiGanot Ok. / var / lib / puppet / ssl removido. Certificado removido do Puppetmaster. Você poderia verificar se o agente se conecta ao mestre de marionetes certo?
030
Ele faz: [root @ grb16 ~] # servidor grep /etc/puppet/puppet.conf server = foreman.company.com
Itai Ganot
1
Você é o cara! bobo eu, esqueci de editar o fuso horário da máquina. Muito obrigado!
Itai Ganot
1
Eu tive esse problema também. Acontece que eu precisava para reiniciar o NTP no meu nó:systemctl restart ntpd
Red Cricket
2

Ocorreu o mesmo problema.

Nossa configuração de marionetes é controlada por versão usando o GitHub; portanto, toda vez que provisionamos um novo mestre de marionetes, encontramos problemas de certificação. Normalmente puppet ca --clean --allfunciona, mas achamos o seguinte mais confiável:

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