Bug 42344 - curl: (60) SSL certificate problem: unable to get local issuer certificate
Summary: curl: (60) SSL certificate problem: unable to get local issuer certificate
Status: CLOSED WONTFIX
Alias: None
Product: Sisyphus
Classification: Development
Component: curl (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 42306
  Show dependency tree
 
Reported: 2022-04-05 20:32 MSK by Vitaly Lipatov
Modified: 2022-04-06 10:28 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Lipatov 2022-04-05 20:32:25 MSK
$ curl -v https://мойассистент.рф
*   Trying 62.105.131.170:443...
* Connected to мойассистент.рф (62.105.131.170) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
*  CAfile: /usr/share/ca-certificates/ca-bundle.crt
*  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate


При этом chromium без проблем открывает сайт.
Comment 1 Anton Farygin 2022-04-05 20:43:45 MSK
https://www.gogetssl.com/news/27.html

IMHO curl тут не при чём и просто делает свою работу.
Comment 2 Gleb F-Malinovskiy 2022-04-05 20:47:41 MSK
Сертификаты-то никто не отзывал, тут дело в плохо сконфигурированном сервере.
Comment 3 Anton Farygin 2022-04-05 20:48:56 MSK
curl --trace out.log https://мойассистент.рф 
рассказывает гораздо больше.

В общем я не совсем понимаю чем бы тут мог помочь curl ?
Comment 4 Anton Farygin 2022-04-05 20:55:39 MSK
Глеб наверное подробнее расскажет в чём проблема, мне кажется что всё из-за того, что сервер отдаёт в сертификате информацию только о последнем удостоверяющем центре в дереве SSL, а у нас его нет, но есть тот, который выдал сертификат ему (корневой).

Браузеры видимо или содержат большую базу, или умеют ходить в сеть за ней.



$ wget https://мойассистент.рф
--2022-04-05 20:52:07--  https://xn--80akicokc0aablc.xn--p1ai/
Распознаётся xn--80akicokc0aablc.xn--p1ai (xn--80akicokc0aablc.xn--p1ai)… 62.105.131.170
Подключение к xn--80akicokc0aablc.xn--p1ai (xn--80akicokc0aablc.xn--p1ai)|62.105.131.170|:443... соединение установлено.
ОШИБКА: невозможно проверить сертификат xn--80akicokc0aablc.xn--p1ai, выпущенный «CN=Sectigo RSA Domain Validation Secure Server CA,O=Sectigo Limited,L=Salford,ST=Greater Manchester,C=GB»:
  Невозможно локально проверить подлинность запрашивающего.
Для небезопасного подключения к xn--80akicokc0aablc.xn--p1ai используйте параметр «--no-check-certificate»
Comment 5 Gleb F-Malinovskiy 2022-04-05 21:02:20 MSK
Дело в том, что приличные SSL-сервера помимо своего сертификата присылают ещё и цепочку, которая ведёт к тем root-овым сертификатам, которые обычно используются в клиентском софте.

Например:
$ openssl s_client -connect altlinux.org:443       
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = www.altlinux.org
verify return:1
---
Certificate chain
 0 s:CN = www.altlinux.org
   i:C = US, O = Let's Encrypt, CN = R3
 1 s:C = US, O = Let's Encrypt, CN = R3
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
 2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
...

т.е сервер прислал целых 3 сертификата, которые позволили клиенту проверить всю цепочку (поскольку 4-й сертификат нашёлся в ca-bundle).

Сервер, о котором идёт речь ведёт себя совершенно иначе:
$ openssl s_client -connect xn--80akicokc0aablc.xn--p1ai:443
CONNECTED(00000003)
depth=0 CN = *.xn--80akicokc0aablc.xn--p1ai
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = *.xn--80akicokc0aablc.xn--p1ai
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 CN = *.xn--80akicokc0aablc.xn--p1ai
verify return:1
---
Certificate chain
 0 s:CN = *.xn--80akicokc0aablc.xn--p1ai
   i:C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
---
т.е. присылает всего один сертификат.

В отличие от curl браузеры умеют читать из сертификата Authority Information Access (AIA), в котором записано, куда нужно сходить в интернете чтобы получить промежуточные сертификаты.
По поводу поддержки AIA в curl см.:
https://github.com/curl/curl/blob/master/docs/TODO#L815
https://github.com/curl/curl/issues/2793
Comment 6 Gleb F-Malinovskiy 2022-04-05 21:41:49 MSK
Ещё более хорошая ссылка на эту тему: https://curl.se/docs/faq.html#Why_do_I_get_certificate_verify

Ну и вот:
https://www.ssllabs.com/ssltest/analyze.html?d=xn--80akicokc0aablc.xn--p1ai
Comment 7 Anton Farygin 2022-04-06 08:26:55 MSK
Глеб, спасибо.

Виталий, может быть напишешь администраторам сайта ?
Comment 8 Vitaly Lipatov 2022-04-06 10:28:08 MSK
(Ответ для Anton Farygin на комментарий #7)
> Глеб, спасибо.
Глеб, спасибо за подробное разъяснение!

> Виталий, может быть напишешь администраторам сайта ?
Да, я написал вчера.