El nuevo servidor no puede recuperar la configuración de Puppetmaster debido a algún error de SSL

14

Tres máquinas en el entorno de producción tenían algunos problemas de hardware y fueron retiradas del servicio. El equipo de infraestructura los reinstaló y les dio los mismos nombres de host y direcciones IP. El objetivo es ejecutar Puppet en estos sistemas para que puedan volver a ponerse en servicio.


Intento

1) Los antiguos certificados de Puppet se eliminaron del Puppetmaster emitiendo los siguientes comandos:

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

2) Una vez que se eliminó el certificado anterior, se creó una nueva solicitud de certificado emitiendo el siguiente comando desde uno de los nodos 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) Una vez que la solicitud de certificado estaba visible en Puppetmaster, se emitió el siguiente comando para firmar la solicitud 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

Una vez que se ha firmado la solicitud de certificado y se ha iniciado una ejecución de Puppet, se produce el siguiente error:

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

Ejecutar Puppet por segunda vez da como resultado:

[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álisis

Para resolver el problema, se investigó el mensaje de error y parece que el problema está relacionado con SSL o Puppet. Quizás uno de estos paquetes se haya instalado incorrectamente o se haya instalado una versión incorrecta en el nodo reinstalado.

Marioneta

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

No se encontraron discrepancias entre los paquetes SSL y Puppet que están instalados en varios servidores. Los sistemas que no han sido retirados del servicio o reinstalados aún pueden ejecutar Puppet. El problema está restringido al servidor reinstalado. Tenga en cuenta que Puppet no se ha ejecutado en los otros dos servidores reinstalados. ¿Qué está causando este problema y cómo solucionarlo?

Itai Ganot
fuente
1
Ehh Revocó los certificados, pero la CRL aún no se ha actualizado. ¿También ha emitido nuevos certificados?
Deer Hunter
Si entiendo el proceso correctamente, el primero puppet agent -tque ejecuto en el cliente crea el certificado y lo envía al puppetmaster para su aprobación, así que si esa es la forma correcta de emitir nuevos certificados, lo hice.
Itai Ganot
@ItaiGanot De hecho, pero a veces algunos certificados antiguos u obsoletos que residen en / var / lib / puppet / ssl en el agente son conflictivos
030
Me encontré con el mismo mensaje de error. Otra cosa a verificar es si la segunda solicitud muestra el mismo fqdn que el nodo. Que la solicitud muestra el fqdn del titiritero.
invitado

Respuestas:

20

Respuesta concisa

El problema CRL is not yet valid forindica que el tiempo entre el Puppet-agent y el Puppetmaster no está sincronizado . Sincronizar la hora (NTP). Elimine el certificado del Puppet-agent y Puppetmaster también y ejecute Puppet en el agente.


Respuesta integral

CRL is not yet valid for reside en el siguiente fragmento.

El siguiente fragmento de código de prueba describe las causas del 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

tema

subject do
  described_class.new(ssl_configuration,
  ssl_host)
end

El código incluye fragmentos de la clase OpenSSL :: X509 :: CRL .

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

La última hora actualizada será la hora actual más un día adicional y se pasará a la función de asunto que llama a la función de llamada que reside en la clase 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

Si preverify_ok es falso, se aplica la cláusula else. Como if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSresultado es falso porque el tiempo se ha topado con un día adicional, se aplicará la declaración else La evaluación de @verify_errors << "#{error_string} for #{crl.issuer}"resultados en CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com.

Para resolver el problema:

  1. Sincronice el tiempo entre el Puppet-agent y el Puppetmaster. ¿El servidor NTP se ejecuta (bien) en ambos nodos?
  2. Elimine o cambie el nombre de la carpeta ssl completa ( / var / lib / puppet / ssl ) del agente.
  3. Revocar el certificado del maestro emitiendo sudo puppet cert clean <fqdn-puppet-agent>
  4. Firme el certificado si la firma automática está deshabilitada
  5. Ejecutar marioneta sobre el agente

En conclusión, el tiempo en Puppet-agents y Puppetmaster debe estar sincronizado todo el tiempo. Exceder la desviación máxima permitida de 5 minutos causará el problema.

030
fuente
Todavía obtengo esto: "[root @ grb16 ~] # puppet agent -t Información: certificado de almacenamiento en caché para grb16.company.com Información: almacenamiento en caché del certificado_revocacion_lista para ca Error: no se pudo solicitar el certificado: SSL_connect devuelto = 1 errno = 0 estado = SSLv3 leer el certificado del servidor B: la verificación del certificado falló: [CRL aún no es válida para / CN = Puppet CA: foreman.company.com] Saliendo; no se pudo recuperar el certificado y waitforcert está deshabilitado
Itai Ganot
@ItaiGanot Ok. / var / lib / puppet / ssl eliminado. Cert eliminado de Puppetmaster. ¿Podría verificar si el agente se conecta con el titiritero correcto?
030
Lo hace: [root @ grb16 ~] # grep server /etc/puppet/puppet.conf server = foreman.company.com
Itai Ganot
1
¡Eres el hombre! tonto, olvidé editar la zona horaria de la máquina. ¡Muchas gracias!
Itai Ganot
1
También tuve este problema. Resulta que necesitaba reiniciar ntp en mi nodo:systemctl restart ntpd
Red Cricket
2

Me encontré con el mismo problema.

Nuestra configuración de títeres está controlada por la versión usando GitHub, por lo que cada vez que aprovisionamos un nuevo puppetmaster, nos encontramos con problemas de certificación. Normalmente puppet ca --clean --allfunciona, pero hemos encontrado lo siguiente más confiable:

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