我将 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;它有 curl 7.22.0。 SSL 终止代理是在同一台机器上运行的 nginx/1.3.13,并且通过/etc/hosts 中的条目将域名指向 127.0.0.1。
关于可能是什么问题的任何线索?谢谢。
最佳答案
如果我们使用 cURL
检索 HTTPS
未使用 CA-signed certificate 的网站,会出现以下问题:
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
简单地克服这个问题。选项,有一个更安全和持久的解决方案,即:第一步
确定您的
OpenSSL
是哪个目录安装用途。openssl version -d
OPENSSLDIR: "/usr/lib/ssl"
第二步
切换到该目录并列出目录内容。您应该会看到一个名为
certs
的目录。 .cd /usr/lib/ssl && ls -al
第三步
切换到那个目录。
cd certs
列出目录内容。您应该从符号链接(symbolic link)中看到证书实际上存储在
/usr/share/ca-certificates
中。 .第 4 步
更改为
/usr/share/ca-certificates
目录和 在那里添加您的自签名证书,(例如:your.cert.name.crt)第五步
更改为
/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 进行测试,它现在应该可以工作了。
Source
关于curl - 为什么 curl 不能识别自签名 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597457/