我下载Win32OpenSSL_Light-1_0_2.exe从闪耀的光芒制作 ,并将其安装到默认位置C:\OpenSSL-Win32
。 我复制的文件CA-bundle.crt到C:\OpenSSL-Win32\bin
和RAN:
C:\OpenSSL-Win32\bin>openssl s_client -connect login.live.com:443 -CAfile ca-bundle.crt
证书链的验证失败与消息:
Verify return code: 20 (unable to get local issuer certificate)
使用具有相同相同的命令CA-bundle.crt与OpenSSL的版本1.0.1e回报Debian的喘息文件:
Verify return code: 0 (ok)
如果我改变主机名api.onedrive.com
(相同的命令),我得到Verify return code: 0 (ok)
两个,Windows和Linux。
我是不是做错了什么,还是有一个已知的bug? 我怎样才能得到它工作在Windows上login.live.com
?
(起初,我偶然发现了此问题时尝试使用在Windows XAMPP PHP的cURL扩展连接login.live.com ,但现在它看起来更像是一个OpenSSL的问题。)
s_client
有无证属性(或可能更长时间站立的bug),如果你给一个-CAfile
选项不仅会检查对给定的CA文件,但也对系统默认值( /usr/lib/ssl/certs
在Debian )。 如果您运行openssl s_client
与strace
检查出哪些文件在验证过程中使用,你会看到以下内容:
$ strace -e open openssl s_client -connect login.live.com:443 -CAfile ca-bundle.crt
...
open("ca-bundle.crt", O_RDONLY) = 3
open("/usr/lib/ssl/cert.pem", O_RDONLY) = -1 ENOENT (No such file or directory)
...
open("/usr/lib/ssl/certs/415660c1.0", O_RDONLY) = 4
open("/usr/lib/ssl/certs/415660c1.1", O_RDONLY) = 4
从这个输出可以看到,它不仅用来验证给定的CA文件,但还尝试使用/usr/lib/ssl/cert.pem
(不存在),然后查找到/usr/lib/ssl/certs
,以找到对象哈希所需的CA 415660c1
。 在那里,它终于找到了根CA是寻找415660c1.1
:
$ openssl x509 -in /usr/lib/ssl/certs/415660c1.1 -text
...
Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
...
Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
由于有在Windows上使用由OpenSSL的任何系统默认值(不能使用Windows CA存储)验证会失败在那里。
至于api.onedrive.com
:这还有一个信任链,并且可以充分地与给定的CA束验证。 从输出strace
显示,它不尝试访问内部的任何文件/usr/lib/ssl/certs
。