我们curl
无法连接到HTTPS服务器遇到了麻烦:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 SSL_R_TLSV1_UNRECOGNIZED_NAME
在ssl.h
。
如果我试试看,openssl s_client -connect the-problem-site.com:443
我会看到
CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
即看起来问题是它不信任/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
。但是安装了该证书:是/etc/ssl/certs/GeoTrust_Global_CA.pem
,如果我运行
openssl s_client-连接-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
然后一切正常。证书也以哈希文件形式存在,位于b0f3e76e.0
中ca-certificates.crt
。但是,据我所知,curl和openssl都没有尝试读取任何证书。如果我是strace
他们,那么即使有错误,也不会尝试读取/usr/lib/ssl/certs
或根本不会读取/etc/ssl/certs
。它确实读取了openssl.cnf。我们已经跑了update-ca-certificates
。
这是Ubuntu 10.04,带有openssl 0.9.8k。我们可以在两个单独的安装中重现该问题(尽管有可能一个人从另一个安装中复制了一个)。如果我在带有openssl 0.9.8e的CentOS VM上尝试相同的测试,那么它可以正常工作,并且可以看到它读取了证书文件strace
。在Ubuntu strace中,没有相同的文件访问权限。如果我将openssl.cnf
文件从CentOS VM 复制到Ubuntu计算机,则没有任何区别。没有明显的环境或.rc文件可能会导致这种情况。
有什么想法我做错了吗?这应该工作吗,即openssl和curl是否应该从命令行自动获取已安装的CA?如何配置?谢谢!
另一个数据点:在13个服务器的全新安装上,curl
确实提取了证书文件并正常工作。openssl s_client
仍然没有。为什么会这样呢?