https Проверка сертификата SSL с помощью Nginx не выполняется с помощью специально созданной библиотеки libcurl + openssl, но работает с системным curl

Я использую libcurl для связи с двумя отдельными веб-серверами по https.

На первом сервере работает Lighttpd 1.4.26-1 на 64-битной Ubuntu 10.04. Lightty построен на основе openssl версии 0.9.8k.

Второй сервер работает под управлением Nginx 0.7.65 на 32-битной Ubuntu 10.04. Nginx построен на основе openssl версии 0.9.8k.

Оба этих сервера используют один и тот же сертификат, и между ними осуществляется циклический перебор DNS. Я использую / etc / hosts, чтобы управлять тем, какой из двух я нажимаю.

Я использую libcurl версии 7.21.2, созданную против openssl 1.0.0c.

Благодаря этому libcurl может успешно отправить https-запрос к легковесному серверу, но не к серверу nginx. Я могу продублировать это с помощью интерфейса командной строки curl. Вот результат команды curl -v:

* About to connect() to <hostname> port 443 (#0)
*   Trying <ip>... connected
* Connected to <hostname> (<ip>) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: cadata
  CApath: none
* 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, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Если я использую более старую версию curl (7.19.7 с openssl 0.9.8l), которая у меня есть в той же системе, работает тот же запрос:

* About to connect() to <hostname> port 443 (#0)
*   Trying <ip>... connected
* Connected to <hostname> (<ip>) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: certdata
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:

Думая, что это как-то связано с новыми версиями curl и / или openssl, я перестроил свои curl и libcurl с той же версией и включенными опциями:

Broken (my build):
seldon:bin ryanowen$ ./curl -V
curl 7.19.7 (i386-apple-darwin10.7.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
Protocols: tftp ftp telnet dict ldap http file https ftps 
Features: GSS-Negotiate IPv6 Largefile NTLM SSL libz 

Works (system version):
seldon:bin ryanowen$ /usr/bin/curl -V
curl 7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
Protocols: tftp ftp telnet dict ldap http file https ftps 
Features: GSS-Negotiate IPv6 Largefile NTLM SSL libz 

К сожалению, это не имело значения. Моя сборка curl по-прежнему не работает (но только при разговоре с сервером nginx), а сборка системы, конечно, все еще работает.

Что может отличаться от моей сборки libcurl, из-за которой не удается выполнить квитирование SSL? Есть ли какие-либо параметры, не отраженные в выводе -V, которые мне нужно включить? Что-нибудь о Nginx, на что мне стоит обратить внимание?


person ryan    schedule 09.06.2011    source источник


Ответы (1)


Я наконец обнаружил проблему на стороне Nginx. Конфигурация Nginx ссылалась на сертификат и ключ сервера, но не на комплект CA. Объединение пакета CA в конец файла сертификата сервера, похоже, решило проблему.

Данные CA, которые я передавал libcurl, включали сертификат CA, но не некоторые другие сертификаты в цепочке. Я предполагаю, что системный curl должен был где-то спрятать эти сертификаты.

person ryan    schedule 09.06.2011
comment
Где вы нашли комплект CA? - person wbadart; 30.03.2017
comment
Нашел ответ на свой вопрос. Я использую certbot v0.11.1, который установил пакет на /etc/letsencrypt/live/domain.com/fullchain.pem - person wbadart; 30.03.2017