Curl: tidak bisa mendapatkan sertifikat penerbit lokal. Bagaimana cara debug?

14

Saya punya masalah aneh. Diperbarui mesin dev LAMP saya (Debian) ke PHP 7. Setelah itu saya tidak dapat terhubung ke API terenkripsi TLS tertentu melalui Curl lagi.

Sertifikat SSL yang dimaksud ditandatangani oleh thawte.

curl https://example.com

memberi saya

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

sedangkan

curl https://thawte.com

yang — tentu saja — juga ditandatangani oleh karya-karya Thawte.

Saya dapat mengakses situs API melalui HTTPS di komputer lain, mis. Desktop saya via curl dan di browser. Jadi, sertifikat itu jelas valid. Peringkat SSL Labs adalah A.

Setiap permintaan Curl lain dari mesin dev saya ke situs SSL terenkripsi lainnya berfungsi. Sertifikat root saya terbaru. Untuk memverifikasi, saya berlari update-ca-certificates. Saya bahkan mengunduh http://curl.haxx.se/ca/cacert.pem ke / etc / ssl / certs dan berlari c_rehash.

Masih kesalahan yang sama.

Apakah ada cara untuk men-debug proses verifikasi dan melihat mana curl sertifikat penerbit (atau openssl) yang mencari tetapi tidak menemukan, yaitu nama file?

MEMPERBARUI

curl -vs https://example.com

beritahu saya (IP + Domain dianonimkan)

* 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

Dan

echo | openssl s_client -connect example.com:443

memberi

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/[email protected]
---
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
rampok
sumber
1
Bisakah Anda memberikan output verbose setidaknya dari cmd itu? curl -vs https://example.com echo | openssl s_client -connect example.com:443
François

Jawaban:

8

Menggunakan openssl s_client -connect thawte.com:443menunjukkan:

---
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" terakhir menunjukkan root yang ditandatangani sendiri yang diterbitkan CA. Saya menduga bahwa Thawte root CA tertentu , _i.e. yang Primer Akar CA - G3 cert, tidak dalam Anda /etc/ssl/certsdirektori (seperti yang dinyatakan dalam curloutput; openssl s_clienttidak memiliki jalan default CA, dan kebutuhan untuk diberikan satu eksplisit, misalnya -CApath /etc/ssl/certs ).

Menambahkan sertifikat itu secara eksplisit ke /etc/ssl/certsdirektori Anda (dan menjalankan kembali c_rehash) tentu tidak ada salahnya. Dan jika itu berfungsi, misalnya seperti diverifikasi menggunakan openssl s_client -connect example.com:443 -CApath /etc/ssl/certs, maka Anda tahu bahwa update-ca-certificatesperintah itu mungkin perlu beberapa pemeriksaan / debugging, mengapa tidak mengambil CA root ini.

Sekarang, mungkin CA root di atas sudah ada di /etc/ssl/certsdirektori Anda , dan langkah-langkah di atas tidak berpengaruh. Dalam hal ini, ada dua sertifikat CA yang mengeluarkan untuk memeriksa (setidaknya dalam rantai sertifikat yang ditawarkan oleh thawte.com:443): thawte Primary Root CA , dan thawte SSL CA - G2 . Mengulangi langkah-langkah di atas untuk menginstal sertifikat ini ke /etc/ssl/certsdirektori Anda (dan menjalankan kembali c_rehash) mungkin berhasil. Karena keduanya adalah CA menengah, dan bukan root CA, ketiadaan salah satunya akan menjelaskan hasil Anda, dan mungkin diharapkan sebagai sertifikat yang diabaikan oleh update-ca-certificates.

Semoga ini membantu!

Castaglia
sumber
Terima kasih! Mengunduh sertifikat perantara "thawte SSL CA - G2" ke / etc / ssl / certs dan rerunning c_rehash memperbaiki masalahnya!
Rob
1
Ini openssl s_client -connect <server>:443 -CAfile cacert.pemperintah ini sangat membantu ... terima kasih!
kris
0

Ini dapat disebabkan oleh urutan situs yang salah, mengeluarkan, sertifikat tengah dan root dalam file sertifikat kunci publik situs.

Browser menampilkan sertifikat dalam arah atas-bawah terbalik (root, menengah, menerbitkan, situs) tetapi sertifikat harus dalam arah atas-bawah (situs, mengeluarkan, menengah, root).

andrej
sumber