ฉันพยายามที่จะให้ข้อผิดพลาดการตรวจสอบใบรับรองด้วยopenssl s_client
เช่นนี้:
$ openssl s_client -crlf -verify 9 \
-CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
-starttls smtp -host mx-ha03.web.de -port 25
ใบรับรองของเซิร์ฟเวอร์ web.de ได้รับการรับรองโดย Deutsche Telekom CA ไม่ใช่ TURKTRUST ดังนั้นคำสั่งดังกล่าวควรล้มเหลวใช่ไหม
แต่รายงาน:
Verify return code: 0 (ok)
ทำไม?
ฉันหมายถึงคำสั่งอะนาล็อก gnutls-cli ล้มเหลวตามที่คาดไว้:
$ { echo -e 'ehlo example.org\nstarttls' ; sleep 1 } | \
gnutls-cli --starttls --crlf \
--x509cafile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
--port 25 mx-ha03.web.de
[..]
*** Verifying server certificate failed...
ทำ crosscheck เช่นใช้แทน--x509cafile /etc/ssl/certs/ca-certificates.crt
gnutls-cli ฉันได้รับ:
[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted
(ซึ่งคาดว่ายัง)
Openssl s_client พิมพ์สำหรับ ca-certificate.crt:
Verify return code: 0 (ok)
ผลลัพธ์เดียวกันสำหรับ TURKTRUST ...
ครั้งแรกที่ฉันสงสัยว่า OpenSSL ใช้การตั้งค่าเริ่มต้นสำหรับ-CApath
(เช่น / etc / SSL / ใบรับรอง) - แต่เมื่อฉันstrace
กระบวนการฉันเพียงแค่เห็นเพียงopen
syscall CAfile
สำหรับอาร์กิวเมนต์ของ
(การทดสอบทั้งหมดทำบนเซิร์ฟเวอร์ Ubuntu 10.04)
อัปเดต:ฉันได้คัดลอกใบรับรอง TURKTRUST ไปยังระบบ Fedora 20 และดำเนินการคำสั่ง openssl แรกแล้ว - ฉันได้รับผลลัพธ์ที่แตกต่าง:
Verify return code: 19 (self signed certificate in certificate chain)