У нас проблемы с curl
подключением к серверу HTTPS:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 находится SSL_R_TLSV1_UNRECOGNIZED_NAME
в ssl.h
.
Если я попытаюсь openssl s_client -connect the-problem-site.com:443
вместо этого тогда я увижу
CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
то есть похоже, что проблема в том, что он не доверяет /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
. Однако этот сертификат установлен: /etc/ssl/certs/GeoTrust_Global_CA.pem
и если вместо этого я запускаю
openssl s_client -connect the-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
тогда все работает. Сертификат также присутствует как файл с хеш-именем b0f3e76e.0
и находится в ca-certificates.crt
. Однако, насколько я вижу, ни curl, ни openssl не пытаются читать какие-либо сертификаты; если я strace
их, то нет никаких попыток прочитать /usr/lib/ssl/certs
или /etc/ssl/certs
вообще, даже с ошибками. Это действительно читает openssl.cnf все же. Мы побежали update-ca-certificates
.
Это Ubuntu 10.04 с openssl 0.9.8k. Мы можем воспроизвести проблему на двух отдельных установках (хотя, возможно, один из них является клоном другого с самого начала). Если я попробую тот же тест на виртуальной машине CentOS с openssl 0.9.8e, то он будет работать нормально, и я вижу, что он читает файл сертификата в strace
. В той же точке в Ubuntu нет эквивалентного доступа к файлу. Если я копирую openssl.cnf
файл с виртуальной машины CentOS на компьютеры с Ubuntu, это не имеет значения. Нет ничего очевидного в среде или файле .rc, которые могут быть причиной этого.
Есть идеи, что я делаю не так? Должно ли это работать, т.е. должен ли openssl и curl автоматически извлекать установленные CA из командной строки? Как это настроено? Спасибо!
Еще один момент данных: при чистой установке 13 серверов, curl
он берет файл сертификатов и работает нормально. openssl s_client
все еще нет, хотя. С чего бы это?
Ответы:
В вашей системе есть несколько криптографических библиотек:
Все они, конечно, имеют сходства и различия. Программное обеспечение, которое использует их (для криптографических целей или для использования SSL / TLS), иногда поддерживает использование более чем одной из этих библиотек (например, веб-браузер Lynx обычно связан с OpenSSL, но также поддерживает GnuTLS (но не так хорошо) в чтобы успокоить людей GNU).
cURL также является одним из проектов, поддерживающих использование одной из трех основных библиотек шифрования. Это происходит главным образом потому, что cURL - это, в первую очередь, библиотека, предназначенная для использования другими программами, когда они хотят загружать (или даже загружать) вещи, используя соединения http, ftp и т. Д. Инструмент
curl
командной строки может быть из любого из этих вариантов.Теперь я совершенно уверен, что проблема, с которой вы сталкиваетесь с неустановленной системой, заключается в следующем:
OpenSSL и GnuTLS поддерживают использование
/etc/ssl/certs/<hash>.<number>
каталогов -style CA. OpenSSL версии 0.x и GnuTLS, однако, используют другой алгоритм для вычисления вышеупомянутого хеша, чем OpenSSL версии 1.x. (Оба могут сосуществовать в системе; если разные сертификаты имеют одинаковый хэш, вы просто используете для них разное число . Но по какой-то причинеca-certificates
пакет Debian / Ubuntu, похоже, этого не делает.) Кроме того, некоторые версии GnuTLS не делали этого. поддержка использования каталога, но только с использованием файла/etc/ssl/certs/ca-certificates.crt
(который также обычно управляетсяca-certificates
сценариями сопровождающего пакета, но может отклоняться); вы, кажется, используете более старую версию, так что это может быть то, что вы нажали.openssl s_client
по умолчанию (т. е. без опции-CApath
или-CAfile
) сертификаты нигде не ищутся .Ваш
curl
из обновленной установки, скорее всего, использует другую библиотеку шифрования, чемcurl
из новой установки.Попробуйте
openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443
в дополнение кopenssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443
имитации поведения старых версий GnuTLS.Дважды проверьте, есть ли OpenSSL 1.x где-нибудь в вашей системе (Ubuntu известен тем, что крадет серьезные обновления даже в версии LTS), и если да, проверьте хеш файла:
Обычно либо вторая и третья команда должны завершиться с ошибкой (OpenSSL 0.x), либо первая и третья команда должны отображать один и тот же хеш, но вторая должна отображать другой хеш (OpenSSL 1.x). GnuTLS будет использовать вывод второй команды (если установлен OpenSSL 1.x); если установлен OpenSSL 0.x, это тот же хеш. Вы можете создать такие символические ссылки вручную.
Я могу обновить эту публикацию, как только вы предоставите отзыв об отладке.
источник