เซิร์ฟเวอร์ใหม่ไม่สามารถดึงข้อมูลการกำหนดค่าจาก Puppetmaster ได้เนื่องจากข้อผิดพลาด ssl


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
ehh คุณเพิกถอน certs แต่ CRL ยังไม่ได้อัปเดต คุณออก certs ใหม่ด้วยหรือไม่?
Deer Hunter Deer

ถ้าฉันเข้าใจกระบวนการอย่างถูกต้องแล้วในครั้งแรกpuppet agent -tที่ฉันเรียกใช้บนไคลเอนต์มันสร้างใบรับรองและส่งไปยัง puppetmaster เพื่อขออนุมัติดังนั้นถ้านั่นเป็นวิธีที่เหมาะสมในการออกใบรับรองใหม่ฉันก็ทำได้
Itai Ganot

@ItaiGanot แน่นอน แต่บางครั้งใบรับรองเก่าหรือล้าสมัยที่อยู่ใน / var / lib / puppet / ssl บนเอเจนต์จะขัดแย้งกัน
030

ฉันพบข้อความแสดงข้อผิดพลาดเดียวกัน สิ่งที่ต้องตรวจสอบก็คือถ้าคำขอที่ 2 แสดง fqdn เหมือนกับโหนด ว่าคำขอแสดง fqdn ของ puppet master
แขกรับเชิญ

คำตอบ:


20

คำตอบที่กระชับ

ปัญหาCRL is not yet valid forบ่งชี้ว่าเวลาระหว่าง Puppet-agent และ 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 เป็นเท็จส่วนคำสั่งอื่น ๆ ที่เกี่ยวข้อง เนื่องจากif crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDSผลลัพธ์เป็นเท็จเนื่องจากเวลาถูก stubbed พร้อมกับวันเพิ่มเติมคำสั่งอื่นจะถูกนำมาใช้ การประเมินผลในการ@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-agent และ Puppetmaster นั้นจะต้องทำการซิงค์ตลอดเวลา เกินค่าเบี่ยงเบนสูงสุดที่อนุญาต 5 นาทีจะทำให้เกิดปัญหา


ฉันยังได้รับ: "[root @ grb16 ~] # puppet agent -t Info: แคชใบรับรองสำหรับ grb16.company.com ข้อมูล: Caching certificate_revocation_list สำหรับ ca ข้อผิดพลาด: ไม่สามารถขอใบรับรอง: SSL_connect ส่งกลับ = 1 errno = 0 state = SSLv3 อ่านใบรับรองเซิร์ฟเวอร์ B: การตรวจสอบใบรับรองล้มเหลว: [CRL ยังไม่ถูกต้องสำหรับ / CN = หุ่น CA: foreman.company.com] กำลังออก, ไม่สามารถเรียกคืนใบรับรองและปิดใช้งาน waitforcert
Itai Ganot

@ItaiGanot Ok / var / lib / puppet / ssl ถูกลบ ใบรับรองถูกลบออกจาก Puppetmaster คุณสามารถตรวจสอบว่าตัวแทนเชื่อมต่อกับ puppetmaster ใช่ไหม?
030

ทำเช่นนี้: [root @ grb16 ~] # grep server /etc/puppet/puppet.conf เซิร์ฟเวอร์ = 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.