openssl s_client错误:验证错误:num = 2:无法获得颁发者证书

时间:2017-11-04 08:26:31

标签: ssl openssl ssl-certificate vpn

我需要连接到某些https://website.com。因此,该网站可通过VPN获得。我已连接到VPN,我可以在浏览器中打开该网站。

我已经从浏览器下载了证书:

enter image description here

然后我cat同时归档到一个certificate.pem

但是当我试图执行命令

openssl s_client -connect website.com:443 -CAfile /path/to/certificate.pem

当我在终端中执行它时,我有一个错误。

CONNECTED(00000003)
depth=1 /C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
verify error:num=2:unable to get issuer certificate
issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
verify return:0
---
Certificate chain
 0 s:/C=AU/ST=Wales/L=Place/O=Company 
Ltd/OU=D&D/CN=website.com 
i:/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
---
Server certificate
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
subject=/C=AU/ST=Wales/L=Place/O=Company 
Ltd/OU=D&D/CN=website.com
issuer=/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
---
No client certificate CA names sent
---
SSL handshake has read 2034 bytes and written 328 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES128-SHA
    Session-ID:     1533BA958D51B9FEAE4C3534F4A417A5896ED17DCAAE83E89E6C2A7F615A583A
    Session-ID-ctx:
    Master-Key: 5CF  D4ACA242B602AAFSDF1234X23E99BD4C62862888947FACFF0E7503BA34C2DD0EC193FA525204A539
    Key-Arg   : None
    Start Time: 1509781851
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

2 个答案:

答案 0 :(得分:3)

历史上

openssl默认情况下仅在证书链以 root 结尾时验证证书链。在信任库中使用服务器即终端实体或叶子证书是没用的,并且不应该需要中间件,因为RFC要求服务器发送它(它们),但是你的服务器显然是有缺陷或配置错误,因为它没有。因此,对于具有中间和root 服务器证书的服务器,用于-CAfile的文件将起作用,假设它们是PEM格式。

或者,最新(和支持)版本1.0.2和1.1.0添加选项-partial_chain 。如果指定,则验证信任库是否具有任何锚点,而不仅仅是根目录。对于您的服务器, 服务器证书用于-CAfile的文件中的中间设置就足够了,再次采用PEM格式。

这些案例在用于验证(1)的手册页中进行了描述,该手册页是从s_client(1)的手册页引用的。某些系统可能会生成1ssl或类似的部分,如果您的系统未正确安装或是Windows,则它们是on the web here

请记住,openssl历史上并且默认情况下不会检查证书中的服务器名称。 1.1.0有新选项-verify_name-verify_hostname这样做。这些内容在手册页中进行了描述,以便对s_client进行验证和引用。

还要记住,许多服务器虽然显然不属于您,但现在使用服务器名称指示(SNI)扩展来支持具有不同证书的多个“虚拟”主机。 openssl默认情况下不会发送SNI,但选项-servername会这样做;这在s_client的手册页中有描述。

通常,查看程序的手册页会告诉您有关程序如何工作以及如何使用它的有用信息,建议使用。 特别是因为这不是编程或开发问题,而且对于StackOverflow来说真的是偏离主题;我会尝试建议迁移到SuperUser或ServerFault,但他们已经有很多欺骗。

答案 1 :(得分:0)

此错误表示openssl正在查找主题为"/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA"的颁发者证书,但文件/path/to/certificate.pem中未提供该证书。建议运行"openssl x509 -in /path/to/certificate.pem -text"以查看此文件中证书的主题 - 应与所请求的不同。