ลอง 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;
}
อ้างอิง