Curl: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น วิธีแก้ปัญหา?


14

ฉันมีปัญหาแปลก ๆ อัปเดตเครื่อง LAMP dev ของฉัน (Debian) เป็น PHP 7 หลังจากนั้นฉันไม่สามารถเชื่อมต่อกับ API ที่เข้ารหัส TLS ผ่านทาง Curl ได้อีกต่อไป

คำถามเกี่ยวกับใบรับรอง SSL ถูกลงชื่อโดย thawte

curl https://example.com

ให้ฉัน

curl: (60) SSL certificate problem: unable to get local issuer certificate

แต่ทว่า

curl https://thawte.com

ซึ่งแน่นอนว่ายังมีลายเซ็นของ Thawte

ฉันสามารถเข้าถึงไซต์ API ผ่าน HTTPS บนเครื่องอื่น ๆ เช่นเดสก์ท็อปของฉันผ่านทาง curl และในเบราว์เซอร์ ดังนั้นใบรับรองจึงมีผลใช้ได้แน่นอน ระดับ SSL Labs คือ A

คำขอ Curl อื่น ๆ จากเครื่อง dev ของฉันไปยังไซต์เข้ารหัส SSL อื่น ๆ ทำงานได้ ใบรับรองหลักของฉันเป็นรุ่นล่าสุดแล้ว update-ca-certificatesหากต้องการตรวจสอบฉันวิ่ง ฉันยังดาวน์โหลดhttp://curl.haxx.se/ca/cacert.pemไปยัง / etc / ssl / certs และรันc_rehashด้วย

ยังคงเป็นข้อผิดพลาดเดียวกัน

มีวิธีใดบ้างที่จะดีบักกระบวนการตรวจสอบและดูว่า curl ใบรับรองของผู้ออกในท้องถิ่น (หรือ openssl) กำลังมองหาอะไร แต่ไม่ค้นหานั่นคือชื่อไฟล์หรือไม่?

UPDATE

curl -vs https://example.com

บอกฉัน (IP + โดเมนไม่ระบุชื่อ)

* Hostname was NOT found in DNS cache
*   Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0

และ

echo | openssl s_client -connect example.com:443

จะช่วยให้

CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=DE/ST=XYZ/CN=*.example.com
   i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
 1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
   i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: [...]
    Session-ID-ctx:
    Master-Key: [...]
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d   Z..@,.k.JPu....-
    [...]
    00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24   ...%.....s...F.$

    Start Time: 1455111516
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE

1
คุณสามารถให้ผล verbose อย่างน้อย cmd เหล่านั้นได้หรือไม่? curl -vs https://example.com echo | openssl s_client -connect example.com:443
François

คำตอบ:


8

ใช้openssl s_client -connect thawte.com:443แสดง:

---
Certificate chain
 0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
   i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
 1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---

สุดท้าย "i" แสดงการรูท CA ที่ลงชื่อด้วยตนเอง ฉันคาดเดาว่าThawte root CAโดยเฉพาะ_i.e ประถม Root CA - G3ใบรับรองไม่ได้อยู่ในของคุณ/etc/ssl/certsไดเรกทอรี (ตามที่ระบุไว้ในการcurlแสดงผลopenssl s_clientไม่ได้มีเส้นทาง CA ค่าเริ่มต้นและความต้องการที่จะได้รับอย่างใดอย่างหนึ่งอย่างชัดเจนเช่น -CApath /etc/ssl/certs )

การเพิ่มใบรับรองนั้นอย่างชัดเจนใน/etc/ssl/certsไดเรกทอรีของคุณ(และเรียกใช้อีกครั้งc_rehash) จะไม่เจ็บแน่นอน และถ้ามันใช้งานได้เช่นที่ได้รับการยืนยันโดยใช้openssl s_client -connect example.com:443 -CApath /etc/ssl/certsคุณก็รู้ว่าupdate-ca-certificatesคำสั่งนั้นอาจต้องมีการตรวจสอบ / การดีบักว่าทำไมมันถึงไม่ได้รูท CA นี้

ตอนนี้อาจเป็นไปได้ว่า CA ของรูทด้านบนมีอยู่ใน/etc/ssl/certsไดเรกทอรีของคุณแล้วและขั้นตอนข้างต้นไม่มีผล ในกรณีที่มีอีกสองใบรับรอง CA ออกเพื่อตรวจสอบ (อย่างน้อยในห่วงโซ่ใบรับรองที่นำเสนอโดยthawte.com:443): Thawte ประถม Root CAและThawte SSL CA - G2 ทำซ้ำขั้นตอนข้างต้นเพื่อติดตั้ง certs เหล่านี้ใน/etc/ssl/certsไดเรกทอรีของคุณ(และเรียกใช้อีกครั้งc_rehash) อาจทำงานได้ เนื่องจากทั้งสองเป็น CA ระดับกลางและไม่ CAs update-ca-certificatesรากขาดอย่างใดอย่างหนึ่งของพวกเขาจะอธิบายผลลัพธ์ของคุณและอาจจะมีการคาดว่าจะมองข้ามโดยใบรับรอง

หวังว่านี่จะช่วยได้!


ขอบคุณ! กำลังดาวน์โหลดใบรับรองระดับกลาง "thawte SSL CA - G2" ไปยัง / etc / ssl / certs และเรียกใช้อีกครั้ง c_rehash แก้ไขปัญหาได้!
Rob

1
นี้openssl s_client -connect <server>:443 -CAfile cacert.pemคำสั่งจะมีประโยชน์มาก ... ขอขอบคุณ!
kris

0

สิ่งนี้อาจเกิดจากคำสั่งของไซต์ที่ไม่ถูกต้องการออกใบรับรองระดับกลางและรูทในไฟล์ใบรับรองกุญแจสาธารณะของไซต์

เบราว์เซอร์จะแสดง certs ในทิศทางกลับด้านบนล่าง (รูท, กลาง, ออก, ไซต์) แต่ใบรับรองจะต้องอยู่ในทิศทางบนสุดล่าง (ไซต์, ออก, กลาง, รูท)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.