일부 SSL 오류로 인해 새 서버가 Puppetmaster에서 구성을 가져올 수 없습니다.


14

프로덕션 환경에있는 세 대의 컴퓨터에 일부 하드웨어 문제가있어 폐기되었습니다. 인프라 팀이이를 다시 설치하고 동일한 호스트 이름과 IP 주소를 제공했습니다. 목표는 이러한 시스템에서 Puppet을 실행하여 다시 시운전 할 수 있도록하는 것입니다.


시도

1) 다음 명령을 실행하여 이전 Puppet 인증서가 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 ~]# 

문제

인증서 요청에 서명하고 Puppet 실행이 시작되면 다음 오류가 발생합니다.

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

두 번째로 Puppet을 실행하면 다음이 발생합니다.

[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 또는 Puppet 관련 문제인 것 같습니다. 이러한 패키지 중 하나가 잘못 설치되었거나 재설치 된 노드에 잘못된 버전이 설치되었을 수 있습니다.

인형

[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 패키지간에 불일치가 없습니다. 서비스 해제 또는 재설치되지 않은 시스템은 여전히 ​​Puppet을 실행할 수 있습니다. 이 문제는 다시 설치된 서버로 제한됩니다. 다시 설치 한 다른 두 서버에서 Puppet이 실행되지 않았습니다. 이 문제의 원인 및 해결 방법은 무엇입니까?


1
어. 인증서를 해지했지만 CRL은 아직 업데이트되지 않았습니다. 새 인증서도 발급 했습니까?
Deer Hunter

프로세스를 올바르게 이해하면 puppet agent -t클라이언트 에서 처음 실행하는 경우 인증서를 생성하고 승인을 위해 꼭두각시 마스터에게 보내므로 새 인증서를 발급하는 올바른 방법이라면 그렇게했습니다.
Itai Ganot

@ItaiGanot 사실, 때로는 에이전트의 / var / lib / puppet / ssl에있는 오래된 인증서 나 오래된 인증서가 충돌하는 경우가 있습니다.
030

동일한 오류 메시지가 발생했습니다. 확인해야 할 또 다른 사항은 두 번째 요청에 노드와 동일한 fqdn이 표시되는지 여부입니다. 요청은 퍼펫 마스터의 fqdn을 보여줍니다.
손님

답변:


20

간결한 답변

이 문제 CRL is not yet valid forPuppet 에이전트와 Puppetmaster 사이의 시간이 동기화되지 않았 음을 나타냅니다 . 시간을 동기화하십시오 (NTP). Puppet-agent 및 Puppetmaster에서도 인증서를 제거하고 에이전트에서 Puppet을 실행하십시오.


종합적인 답변

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;
}

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 절이 적용됩니다. 으로 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. Puppet-agent와 Puppetmaster 사이의 시간을 동기화하십시오. NTP 서버가 두 노드에서 모두 실행됩니까?
  2. 에이전트에서 완전한 ssl 폴더 ( / var / lib / puppet / ssl )를 제거하거나 이름을 바꾸십시오 .
  3. 발급하여 마스터에서 인증서를 해지하십시오. sudo puppet cert clean <fqdn-puppet-agent>
  4. 자동 서명이 비활성화 된 경우 인증서 서명
  5. 에이전트에서 퍼펫 실행

결론적으로 Puppet 에이전트와 Puppetmaster의 시간은 항상 동기화되어야합니다. 최대 허용 편차가 5 분을 초과하면 문제가 발생합니다.


"[root @ grb16 ~] # 꼭두각시 에이전트 -t 정보 : grb16.company.com에 대한 캐싱 인증서 정보 : ca에 대한 certificate_revocation_list 캐싱 오류 : 인증서를 요청할 수 없음 : SSL_connect 리턴 = 1 errno = 0 state = SSLv3 서버 인증서 B를 읽어 인증서 확인 실패 : CRL은 / CN = 인형 CA 아직 유효하지 않습니다 foreman.company.com] 나가기; 인증서를 검색하고 waitforcert가 비활성화하는 데 실패
이타 Ganot

@ItaiGanot Ok. / var / lib / puppet / ssl이 제거되었습니다. Puppetmaster에서 인증서가 제거되었습니다. 에이전트가 올바른 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를 사용하여 버전을 제어하므로 새 퍼펫 마스터를 프로비저닝 할 때마다 인증서 문제가 발생합니다. 일반적으로 puppet ca --clean --all작동하지만 다음을 더 신뢰할 수 있습니다.

rm -rf $(puppet master --configprint ssldir)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.