Проверка SSL-сертификата https с помощью Nginx завершается неудачно с помощью встроенного libcurl + openssl, но работает с системным curl - PullRequest
1 голос
/ 09 июня 2011

Я использую 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 на сервер lightty, но не на сервер 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, на которую я должен обратить внимание?

1 Ответ

4 голосов
/ 10 июня 2011

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

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

...