Curl: невозможно получить сертификат местного эмитента. Как отлаживать?

14

У меня странная проблема. Обновил мою машину разработчика LAMP (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.

Все та же ошибка.

Есть ли способ отладки процесса проверки и посмотреть, какой локатор сертификата локального эмитента (или 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
---

Последнее «i» показывает выдающий самоподписанный корневой 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каталоге, и описанные выше действия не дали результатов. В этом случае необходимо проверить еще два сертификата выдающего ЦС (по крайней мере, в цепочке сертификатов, предлагаемых thawte.com:443): thawte Primary Root CA и thawte SSL CA - G2 . Повторение вышеуказанных шагов для установки этих сертификатов в ваш /etc/ssl/certsкаталог (и повторное выполнение c_rehash) может работать. Поскольку эти два являются промежуточными центрами сертификации, а не корневыми центрами сертификации, отсутствие одного из них может объяснить ваши результаты и может ожидаться как пропущенные сертификаты update-ca-certificates.

Надеюсь это поможет!

Castaglia
источник
Благодарность! Загрузка промежуточного сертификата «thawte SSL CA - G2» в / etc / ssl / certs и повторный запуск c_rehash устранили проблему!
Роб
1
Эта openssl s_client -connect <server>:443 -CAfile cacert.pemкоманда очень полезна ... спасибо!
Крис
0

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

Браузер отображает сертификаты в обратном направлении сверху вниз (корневой, промежуточный, выдающий, сайт), но сертификат должен быть в нижнем верхнем направлении (сайт, выдающий, промежуточный, корневой).

андрей
источник