25

我将 PEM 文件复制到 /usr/local/share/ca-certificates/ 并运行 update-ca-certificates,并验证生成的证书现在包含在 /etc/ssl/certs/ca-certificates.crt 中curl-config --ca 打印的文件。我还验证了 openssl s_client -connect example.com:443 打印的证书与我的 PEM 文件相同。但是我继续收到“错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败”消息。即使我使用http://curl.haxx.se/docs/sslcerts.html中描述的 curl 的 --cacert 选项来告诉它使用什么证书,也会发生这种情况。

如果我使用 curl -k 完全禁用证书验证,它会起作用,但我不想这样做,因为我正在尝试编写一个应该正确测试 SSL 的测试工具。

如果我在 lynx 中访问相同的 URL,它工作正常,如果有任何 SSL 错误,它通常会抱怨。但是我不能只将 Lynx 用于这个测试工具,除非我能找到某种方法让 Tornado 的 AsyncHTTPClient 使用 Lynx 而不是 libcurl。而且安装自签名证书满足 Lynx 但不满足 curl 似乎没有任何意义。

我在 Vagrant 驱动的 VirtualBox 中使用 Ubuntu 12.04 LTS;它有卷曲 7.22.0。SSL 终止代理是在同一台机器上运行的 nginx/1.3.13,并且通过 /etc/hosts 中的条目将域名指向 127.0.0.1。

关于可能是什么问题的任何线索?谢谢。

4

1 回答 1

26

如果我们cURL用来检索一个HTTPS没有使用CA 签名证书的站点,就会出现以下问题:

curl https://example.selfip.com
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

虽然我们可以使用该选项简单地克服这个问题-k,但有一个更安全和持久的解决方案,即:

步骤 1
确定您的OpenSSL安装使用的目录。

openssl version -d
OPENSSLDIR: "/usr/lib/ssl"

步骤 2
切换到该目录并列出目录内容。您应该会看到一个名为certs.

cd /usr/lib/ssl && ls -al

步骤 3
切换到该目录。

cd certs

列出目录内容。您应该从符号链接中看到证书实际存储在/usr/share/ca-certificates.

第 4 步
切换到/usr/share/ca-certificates目录并在那里添加您的自签名证书,(例如:your.cert.name.crt)

步骤 5
切换到/etc目录并编辑文件ca-certificates.conf

root@ubuntu:# cd /etc
root@ubuntu:# nano ca-certificates.conf

添加your.cert.name.crt到文件 ( ca-certificates.conf) 并保存。

最后一步:

执行程序update-ca-certificates –fresh
注意:您可能希望/etc/ssl/certs在执行命令之前进行备份。

root@ubuntu:# update-ca-certificates --fresh
Clearing symlinks in /etc/ssl/certs...done.
Updating certificates in /etc/ssl/certs....done.
Running hooks in /etc/ca-certificates/update.d....done.

在您的目标 HTTPS 站点上使用 curl 进行测试,它现在应该可以工作了。

资源

于 2014-01-21T15:46:42.773 回答