问题
我农场中的一台服务器突然无法正确处理 SSL 证书。尝试执行如下 curl 命令,curl -v https://google.com
结果如下:
curl -v https://google.com
* About to connect() to google.com port 443 (#0)
* Trying 74.125.137.101... connected
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* 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
使用openssl s_client
更详细一些。
# openssl s_client -host google.com -port 443
CONNECTED(00000003)
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
迄今为止尝试过的事情
重新安装
ca-certificates
-根据aptitude
,已经有最新可用版本Version: 20130906ubuntu0.12.04.1
。ca-certificates
通过重新配置dpkg-reconfigure
。这似乎会重新整理/etc/ssl/certs
文件夹,但对问题没有影响。用于
update-ca-certificates --fresh
重新生成该文件夹中的符号链接curl.haxx.se
通过放入 .pem 文件/etc/ssl/certs
并运行更新命令,从 - 获取最新的 Mozilla ca 包。
怪异之处
curl
声称找不到的证书实际上在认证路径中。
# ls -l /etc/ssl/certs/*Geo*
lrwxrwxrwx 1 root root 57 Apr 7 15:57 /etc/ssl/certs/GeoTrust_Global_CA.pem -> /usr/share/ca-certificates/mozilla/GeoTrust_Global_CA.crt
...
引用的证书文件具有与我的网络上每个其他框相同的权限,即 644。
# ls -l /usr/share/ca-certificates/mozilla/GeoTrust_Global_CA.crt
-rw-r--r-- 1 root root 1216 Feb 20 11:49 /usr/share/ca-certificates/mozilla/GeoTrust_Global_CA.crt
Github 等其他安全站点使用不同的证书也存在同样的问题。我正在运行适用于 Ubuntu 12.04.4 的所有软件包的最新版本,包括curl
、openssl
和ca-certificates
。
这里发生了什么?
答案1
我也遇到了这个问题,试试这个:
openssl s_client -host google.com -port 443
此命令还将打印证书链,最后一个是:
s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
此证书路径与浏览器(IE,Firefox,Chrome)中显示的证书路径不同,我不知道为什么,但这解决了我的问题。
答案2
经过几次更新后,这个问题不再发生。Ubuntu repos 中提供的 ca-certificates 文件似乎缺少 GeoTrust 的中间证书。