Score:2

จะแก้ไขห่วงโซ่ใบรับรองด้วย letsencrypt / certbot ได้อย่างไร

ธง cn

ฉันไม่สามารถคาดเดาปัญหาต่อไปนี้ได้ การตรวจสอบใบรับรองของเซิร์ฟเวอร์ด้วย openssl ล้มเหลว ห่วงโซ่ไม่สมบูรณ์

ข้อจำกัดความรับผิดชอบ: ฉันไม่ใช่ผู้ดูแลระบบและยังไม่ได้ทำงานกับใบรับรองมากนัก

ยืนยันด้วย OpenSSL

$ openssl ตรวจสอบ -CAfile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem /etc/letsencrypt/live/co2-avatar.com/cert.pem

# /etc/letsencrypt/live/co2-avatar.com/cert.pem: C = US, O = Internet Security Research Group, CN = ISRG Root X1
# ข้อผิดพลาด 2 ที่การค้นหาเชิงลึก 2: ไม่สามารถรับใบรับรองผู้ออก

ตรวจสอบหนึ่งในโดเมนในใบรับรอง

openssl s_client -เชื่อมต่อ co2avatar.org:443 -ชื่อเซิร์ฟเวอร์ co2avatar.org
# เชื่อมต่อ (00000003)
# ความลึก = 0 CN = gitlab.sustainable-data-platform.org
# ตรวจสอบข้อผิดพลาด: num=20: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น
# ตรวจสอบผลตอบแทน:1
# ความลึก = 0 CN = gitlab.sustainable-data-platform.org
# ตรวจสอบข้อผิดพลาด:num=21:ไม่สามารถตรวจสอบใบรับรองแรก
# ตรวจสอบผลตอบแทน:1
# ---
#สายใบรับรอง
# 0 s:CN = gitlab.sustainable-data-platform.org
# i:C = US, O = Let's Encrypt, CN = R3
# ---
#ใบรับรองเซิฟเวอร์
# ----- เริ่มใบรับรอง -----

หรือวิ่ง

ขด -v https://co2avatar.org
# * ลอง 85.214.38.88:443...
# * ตั้งค่า TCP_NODELAY
# * เชื่อมต่อกับ co2avatar.org (85.214.38.88) พอร์ต 443 (#0)
# * ALPN เสนอ h2
# * ALPN นำเสนอ http/1.1.1
# * ตั้งค่าตำแหน่งการตรวจสอบใบรับรองสำเร็จแล้ว:
# * CAfile: /etc/ssl/certs/ca-certificates.crt
# CApath: /etc/ssl/certs
# * TLSv1.3 (ออก), การจับมือ TLS, สวัสดีลูกค้า (1):
# * TLSv1.3 (IN), การจับมือ TLS, สวัสดีเซิร์ฟเวอร์ (2):
# * TLSv1.2 (IN), การจับมือ TLS, ใบรับรอง (11):
# * TLSv1.2 (ออก), การแจ้งเตือน TLS, CA ที่ไม่รู้จัก (560):
# * ปัญหาใบรับรอง SSL: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น
# * ปิดการเชื่อมต่อ 0
# curl: (60) ปัญหาใบรับรอง SSL: ไม่สามารถรับใบรับรองผู้ออกในเครื่อง

อาจมีทั้งสองอย่าง การกำหนดค่าผิดใน Apache VHost ของฉันสำหรับโดเมน ตลอดจนปัญหาในสายใบรับรองเอง เช็คอันล่าสุดยังไงครับ (กูกูเกิ้ลมาก็เยอะ แต่ส่วนใหญ่ฮิตประมาณ ยืนยัน openssl กับ -CAfile หรือเกี่ยวกับผู้ออกใบรับรองรายอื่น)?

ฉันจำเป็นต้องตรวจสอบ ชุดใบรับรองรูท และอย่างไรกันแน่?

มีบางอย่างเช่น -เพิ่มความน่าเชื่อถือ ธง สำหรับ certbot แน่นอน?

Score:6
ธง in

ลอง openssl s_client และให้คุณแสดงใบรับรอง คำสั่งคือ:

$ openssl s_client -เชื่อมต่อ co2avatar.org:443 -ชื่อเซิร์ฟเวอร์ co2avatar.org -showcerts

คุณจะพบว่าเซิร์ฟเวอร์ของคุณส่งคืนใบรับรองสำหรับ CN = gitlab.sustainable-data-platform.org และชื่อเรื่องอื่นที่มีโดเมนของคุณ DNS:co2-avatar.com. ดังนั้นใบรับรองเองก็ใช้ได้

หากคุณต้องการรวมทุกอย่างไว้ในท่อส่งคำสั่งเดียวเพื่อดูเนื้อหาของใบรับรองของคุณ:

เสียงสะท้อน | openssl s_client -เชื่อมต่อ co2avatar.org:443 -ชื่อเซิร์ฟเวอร์ co2avatar.org -showcerts 2>/dev/null |sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | opensl x509 -noout -ข้อความ

สิ่งที่ขาดหายไปคือใบรับรองกลาง เซิร์ฟเวอร์ควรส่งสิ่งนี้เช่นกัน แต่คำสั่งแรกแสดงให้คุณเห็นว่าไม่มี - เซิร์ฟเวอร์ของคุณส่งใบรับรองเท่านั้น

ดังนั้น openssl ที่ล้มเหลวจึงถูกต้องเนื่องจากไม่มีใบรับรองระดับกลาง

ดังนั้นเพื่อแก้ปัญหานี้ คุณต้องปรับแต่งการกำหนดค่า apache ของคุณ นี่คือลักษณะของการกำหนดค่าของคุณ:

ชื่อไฟล์ควรคล้ายกับ /etc/apache2/sites-enabled/co2-avatar.com-le-ssl.conf

<IfModule mod_ssl.c>
SSLStaplingCache shmcb:/var/run/apache2/stapling_cache(128000)
<VirtualHost *:443>
        ServerName co2-avatar.com
        ServerAlias www.co2-avatar.com
#... 
#... insert your other stuff here...
#...

SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/co2-avatar.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLUseStapling on
</VirtualHost>
</IfModule>

จากคำอธิบายของคุณ ฉันคาดเดาได้ดีที่สุดว่าบรรทัดต่อไปนี้ผิดในการกำหนดค่าของคุณ: SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/cert.pem. ควรเปลี่ยนด้วย SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pemเพื่อส่งตัวกลางด้วย

อัปเดตโซลูชัน (หลังการสนทนา)

มีการพูดคุยกันว่าเวอร์ชันของ openssl และ Apache ที่ใช้บนเซิร์ฟเวอร์ CentOS นี้เก่ากว่า ดังนั้นจึงไม่รองรับฟีเจอร์บางอย่าง (Apache 2.4.6, OpenSSL 1.0.2k, การกำหนดค่าระดับกลาง, ไม่มี HSTS, ไม่มี OCSP)

ตาม ตัวสร้างการกำหนดค่า Mozilla SSL การกำหนดค่าทั่วไปต่อไปนี้สามารถใช้ได้ในกรณีนี้:

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate
    SSLCertificateChainFile /path/to/intermediate_certificate
    SSLCertificateKeyFile   /path/to/private_key
</VirtualHost>

แปลเป็นกรณีเฉพาะนี้ การกำหนดค่าการทำงานที่ได้จะเป็นดังนี้:

<VirtualHost *:443>
    ServerName  sustainable-data-platform.org
    ServerAlias co2-avatar.com
    ServerAlias ... <include all other SAN names here>
    
    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/co2-avatar.com/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/co2-avatar.com/privkey.pem

</VirtualHost>

หมายเหตุสำหรับการติดตั้งแบบเก่าดังกล่าว

Cross-Signed Letâs Encrypt R3 และ DST Root CA X3, ใบรับรองระดับกลางและระดับรูทจะหมดอายุในวันที่ 29 กันยายน 2021 และ 30 กันยายน 2021 ตามลำดับ ดังนั้น ตั้งแต่วันที่ 4 พฤษภาคม 2021 ใบรับรองที่ออกใหม่จะใช้ห่วงโซ่ที่ยาวขึ้นโดยมี ISRG Root X1 ที่ลงนามไขว้เป็นใบรับรองระดับกลาง

ขออภัย เนื่องจากวิธีสร้างและตรวจสอบเส้นทางใบรับรอง การใช้งาน TLS บางส่วนจึงไม่สามารถยืนยันการลงชื่อข้ามได้สำเร็จ นี่เป็นกรณีของ OpenSSL 1.0.2 ดังนั้น โปรแกรมที่ทำงานบน RHEL/CentOS 7 ที่ใช้ OpenSSL อาจล้มเหลวในการตรวจสอบห่วงโซ่ใบรับรองใหม่หรือสร้างการเชื่อมต่อ TLS การอัปเกรดเป็นเวอร์ชัน Openssl ที่ใหม่กว่าบนแพลตฟอร์มดังกล่าวนั้นไม่ใช่เรื่องง่าย

มีตัวเลือกไม่กี่อย่าง: อัปเดตที่เก็บที่เชื่อถือได้ (ลบใบรับรองรูท DST Root CA X3 - เมื่อลบออกแล้ว ผลกระทบควรน้อยที่สุด) ในฝั่งไคลเอ็นต์ (หรือ) เปลี่ยนสายใบรับรองในฝั่งเซิร์ฟเวอร์

สำหรับ Nginx

สำหรับ Nginx มีเพียงหนึ่งพารามิเตอร์เพื่อระบุไฟล์ใบรับรอง คุณควรใช้ fullchain.pem จัดทำโดย certbot เพื่อให้ทำงานได้อย่างถูกต้อง

การกำหนดค่าที่ถูกต้องในบล็อกเซิร์ฟเวอร์สำหรับ virtualhost ที่กำหนดจะเป็นดังนี้:

เซิร์ฟเวอร์ {
  ...
  ssl_certificate /etc/letsencrypt/live/co2-avatar.com/fullchain.pem; -> แทนที่ cert.pem เป็น fullchain.pem
  ssl_certificate_key /etc/letsencrypt/live/co2-avatar.com/privkey.pem;
}

อ้างอิง

BairDev avatar
cn flag
ขอบคุณ! ฉันใช้ไฟล์ *fullchain* อยู่แล้ว เหมือนกับ `SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem` ดังนั้นใบรับรองระดับกลางจึงไม่ปรากฏ ซึ่งอาจอธิบายความล้มเหลวของ `openssl Verify -CAfile .../fullchain.pem .../cert.pem` คุณเห็นสิ่งนี้ได้อย่างไร: *สิ่งที่ขาดหายไปคือใบรับรองระดับกลาง* ฉันเดาว่าฉันต้องแก้ไขใบรับรอง คำแนะนำใด ๆ สำหรับสิ่งนั้น?
in flag
ตอบคำถามที่สองของคุณ: คำสั่ง `openssl s_client ... -showcerts` แสดงใบรับรอง **ทั้งหมด** ที่ส่งโดยเซิร์ฟเวอร์ ในกรณีของคุณ: การส่งคืนใบรับรองเพียงใบเดียวแสดงว่าใบรับรองกลางขาดหายไป คุณสามารถดูได้ดีที่สุดหากคุณเปรียบเทียบกับผลลัพธ์ในกรณีที่คุณใช้โดเมนอื่น ตัวอย่างเพื่อเปรียบเทียบกับ: `ก้อง | openssl s_client -เชื่อมต่อ belug.de:443 -ชื่อเซิร์ฟเวอร์ belug.de -showcerts` ตรวจสอบว่าใบรับรองที่คาดหวังทั้งหมดรวมอยู่ในไฟล์ `fullchain.pem` ของคุณหรือไม่ (คาดว่าจะเห็นมากกว่าหนึ่งใบรับรองที่นั่น)
in flag
ในการตอบคำถามแรกของคุณ: เนื่องจากใบรับรองระดับกลางมีอยู่ในไฟล์ `fullchain.pem` **และ** ที่กำหนดค่าใน vhost ของคุณ แต่ **ไม่ได้ส่งมาจากเซิร์ฟเวอร์ของคุณ แสดงว่ามีไฟล์ vhost อื่นอยู่ ใช้แล้ว. ตรวจสอบไฟล์การกำหนดค่า Apache อื่น ๆ - ฉันพนันได้เลยว่าการกำหนดค่า vhost ทับซ้อนกัน
BairDev avatar
cn flag
เอาล่ะ ตอนนี้คำสั่ง SSLCertificateFile ทั้งหมดในไฟล์ conf ของฉันชี้ไปที่ *fullchain.pem* แต่ใบรับรองที่สองในไฟล์นี้ไม่ได้ถูกจัดส่ง คำสั่ง SSLCertificateChainFile คืออะไร (เลิกใช้แล้วใช่ไหม) ดูเหมือนว่าการกำหนดค่าอื่นๆ จะบล็อกไฟล์ fullchain.pem (ใช่ ฉันรีสตาร์ท apache / httpd แล้ว)
BairDev avatar
cn flag
ปรากฎว่าเวอร์ชัน Apache ต่ำ / เก่าเกินไป (

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา