我正在使用libcurl通过https与两个单独的Web服务器通信。
第一台服务器在64位Ubuntu 10.04上运行Lighttpd 1.4.26-1。 Lightty是针对openssl 0.9.8k版本构建的。
第二台服务器在32位Ubuntu 10.04上运行Nginx 0.7.65。 Nginx是针对openssl 0.9.8k版本构建的。
这两个服务器都使用相同的证书,DNS在它们之间进行循环。我使用/ etc / hosts来管理我正在击中的两个中的哪一个。
我正在使用针对openssl 1.0.0c构建的libcurl版本7.21.2。
有了这个,libcurl可以成功地向轻量级服务器发出https请求,但不能向nginx服务器发出https请求。我可以使用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 with 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服务器通信时),而系统构建当然仍然有效。
导致SSL失败的libcurl构建有什么不同?是否有任何选项未反映在我需要启用的-V输出中?有关Nginx方面的任何事情,我应该研究一下吗?
答案 0 :(得分:3)
我终于在Nginx方面发现了这个问题。 Nginx配置引用了服务器证书和密钥,但不引用了CA捆绑包。将CA捆绑包连接到服务器证书文件的末尾似乎已经解决了这个问题。
我向libcurl提供的CA数据包括CA证书,但不包括链中的其他证书。我想系统卷曲必须将这些证书藏匿在某处。