的s_client.First证书验证的Windows无法为login.live.com(s_cli

2019-11-03 17:13发布

我下载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的问题。)

Answer 1:

s_client有无证属性(或可能更长时间站立的bug),如果你给一个-CAfile选项不仅会检查对给定的CA文件,但也对系统默认值( /usr/lib/ssl/certs在Debian )。 如果您运行openssl s_clientstrace检查出哪些文件在验证过程中使用,你会看到以下内容:

$ 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



文章来源: s_client certificate validation fails in Windows for login.live.com