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