Curl: không thể có được chứng chỉ nhà phát hành địa phương. Làm thế nào để gỡ lỗi?


14

Tôi đã có một vấn đề kỳ lạ. Đã cập nhật máy dev LAMP (Debian) của tôi lên PHP 7. Sau đó tôi không thể kết nối với API được mã hóa TLS cụ thể qua Curl nữa.

Chứng chỉ SSL trong câu hỏi được ký bởi thawte.

curl https://example.com

đưa cho tôi

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

trong khi

curl https://thawte.com

Điều mà tất nhiên, cũng có thể được ký kết bởi các tác phẩm của Thawte.

Tôi có thể truy cập trang web API thông qua HTTPS trên các máy khác, ví dụ: Máy tính để bàn của tôi thông qua curl và trong trình duyệt. Vì vậy, chứng chỉ chắc chắn là hợp lệ. Xếp hạng SSL Labs là A.

Bất kỳ yêu cầu Curl nào khác từ máy dev của tôi đến các trang web được mã hóa SSL khác đều hoạt động. Certs gốc của tôi được cập nhật. Để xác minh, tôi chạy update-ca-certificates. Tôi thậm chí đã tải xuống http://curl.haxx.se/ca/cacert.pem để / etc / ssl / certs và chạy c_rehash.

Vẫn cùng một lỗi.

Có cách nào để gỡ lỗi quá trình xác minh và xem curl chứng chỉ nhà phát hành địa phương (hoặc openssl) đang tìm kiếm nhưng không tìm thấy, tức là tên tệp?

CẬP NHẬT

curl -vs https://example.com

cho tôi biết (IP + Tên miền ẩn danh)

* 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

cho

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
Bạn có thể cho một đầu ra dài dòng của ít nhất các cmd đó không? curl -vs https://example.com echo | openssl s_client -connect example.com:443
François

Câu trả lời:


8

Sử dụng openssl s_client -connect thawte.com:443chương trình:

---
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
---

Chữ "i" cuối cùng đó cho thấy CA gốc tự ký. Tôi đoán rằng CA gốc Thawte cụ thể đó , _i.e. các tiểu Root CA - G3 cert, không có trong của bạn /etc/ssl/certsthư mục (như đã nêu ở curlđầu ra; openssl s_clientkhông có một con đường CA mặc định, và cần phải được một cách rõ ràng, ví dụ -CApath /etc/ssl/certs ).

Thêm chứng chỉ đó rõ ràng vào /etc/ssl/certsthư mục của bạn (và chạy lại c_rehash) chắc chắn sẽ không gây hại. Và nếu nó hoạt động, ví dụ như được xác minh bằng cách sử dụng openssl s_client -connect example.com:443 -CApath /etc/ssl/certs, thì bạn biết rằng update-ca-certificateslệnh đó có thể cần một số kiểm tra / gỡ lỗi, như lý do tại sao nó không chọn CA gốc này.

Bây giờ, có thể là CA gốc ở trên đã có trong /etc/ssl/certsthư mục của bạn và các bước trên không có hiệu lực. Trong trường hợp đó, có hai loại CA phát hành khác để kiểm tra (ít nhất là trong chuỗi chứng chỉ được cung cấp bởi thawte.com:443): thawte Primary Root CAthawte SSL CA - G2 . Lặp lại các bước trên để cài đặt các certs này vào /etc/ssl/certsthư mục của bạn (và chạy lại c_rehash) có thể hoạt động. Vì hai cái này là CA trung gian và không phải CA gốc, nên sự vắng mặt của một trong số chúng sẽ giải thích kết quả của bạn và có thể được coi là các certs bị bỏ qua update-ca-certificates.

Hi vọng điêu nay co ich!


Cảm ơn! Tải xuống chứng chỉ trung gian "thawte SSL CA - G2" về / etc / ssl / certs và chạy lại c_rehash đã khắc phục sự cố!
Cướp

1
Đây openssl s_client -connect <server>:443 -CAfile cacert.pemlệnh rất hữu ích ... thank you!
kris

0

Điều này có thể được gây ra bởi thứ tự sai của trang web, cấp, chứng chỉ trung gian và gốc trong tệp chứng chỉ khóa công khai của trang.

Trình duyệt hiển thị các certs theo hướng ngược lại từ trên xuống (gốc, trung gian, phát hành, trang web) nhưng chứng chỉ phải theo hướng từ dưới lên (trang web, phát hành, trung gian, gốc).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.