Curl: не вдається отримати сертифікат місцевого емітента. Як налагодити?


14

У мене дивна проблема. Оновив свою машину розробки LAMP (Debian) до PHP 7. Після цього я більше не можу підключитися до конкретного зашифрованого TLS API через 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 та в браузері. Таким чином, cert, безумовно, дійсний. Рейтинг лабораторій SSL становить А.

Будь-які інші запити на Curl від мого розробника на інших зашифрованих SSL сайтах працюють. Мої кореневі церкви актуалізовані. Щоб перевірити, я побіг update-ca-certificates. Я навіть скачав http://curl.haxx.se/ca/cacert.pem в / etc / ssl / certs і побіг c_rehash.

Ще та сама помилка.

Чи є спосіб налагодити процес підтвердження і побачити, який сертифікат локального видавця сертифікат (або openssl) шукає, але не знаходить, тобто ім'я файлу?

ОНОВЛЕННЯ

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
Чи можете ви дати багатослівний вихід принаймні з цих cmd? curl -vs https://example.com echo | openssl s_client -connect example.com:443
Франсуа

Відповіді:


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

Останнє "я" показує видаючий самопідписаний корінь CA. Я здогадуюсь, що саме цей корінь Thawte CA , _i.e. Первинний Root CA - G3 CERT, не в вашій /etc/ssl/certsдиректорії (як зазначено в curlвихідний, openssl s_clientне має шляху ЦС по замовчуванням, і потреби в даній, в явному вигляді, наприклад -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каталозі, і перераховані вище кроки не мали ефекту. У цьому випадку для перевірки (щонайменше, в ланцюзі cert, запропонованих компанією ) , є дві інші сертифікати CA, що випускаютьсяthawte.com:443 : thawte Primary Root CA і thawte SSL CA - G2 . Повторення вищезазначених кроків для встановлення цих сертифікатів у ваш /etc/ssl/certsкаталог (та повторний запуск c_rehash) може спрацювати. Оскільки ці два є проміжними СА, а не кореневими СА, відсутність одного з них пояснить ваші результати, і, можливо, можна очікувати як недоглянуті серти update-ca-certificates.

Сподіваюся, це допомагає!


Дякую! Завантаження проміжного сертифіката "thawte SSL CA - G2" в / etc / ssl / certs та повторне повторення c_rehash виправили проблему!
Роб

1
Ця openssl s_client -connect <server>:443 -CAfile cacert.pemкоманда дуже корисна ... дякую!
kris

0

Це може бути викликано неправильним порядком сайту, видачею, проміжними та кореневими сертифікатами у файлі сертифікатів відкритого ключа сайту.

Браузер відображає сертифікати у зворотному напрямку зверху-вниз (корінь, проміжний, видача, сайт), але сертифікат повинен бути у напрямку знизу вгорі (сайт, видача, проміжний, корінь).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.