У нас проблемы с 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
все еще нет, хотя. С чего бы это?