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

Ily*_*vov 1 vpn ssl openssl ssl-certificate

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

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

在此处输入图片说明

然后我cat两个文件合二为一certificate.pem

但是当我尝试执行命令时

openssl s_client -connect website.com:443 -CAfile /path/to/certificate.pem
Run Code Online (Sandbox Code Playgroud)

当我在终端中执行它时,出现错误。

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)
Run Code Online (Sandbox Code Playgroud)

dav*_*085 7

openssl从历史上看,默认情况下,仅当证书链以root结尾时才验证证书链。有又名信任库终端实体或叶证书服务器也没用,中间(或多个)不应该被需要的,因为RFC中所需要的服务器发送它(它们),但你的服务器显然是有缺陷的或错误配置,因为它不. 因此,对于您的服务器具有 middle和 root,但没有服务器证书,在用于的文件-CAfile中将起作用,假设它们是 PEM 格式。

或者,最近(和支持的)版本 1.0.2 和 1.1.0 添加了一个option-partial_chain。如果指定,这将验证信任库是否具有任何锚点,而不仅仅是根。对于您的服务器,其无论是在服务器证书用于文件中间-CAfile就足够了,再PEM格式。

这些情况在 verify(1) 的手册页中进行了描述,该手册页从 s_client(1) 的手册页中引用。有些系统可能会制作 1ssl 或类似的部分,如果您的系统没有正确安装或者是 Windows,它们在网上


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

还请记住,许多服务器(虽然显然不是您的)现在使用服务器名称指示 (SNI) 扩展来支持具有不同证书的多个“虚拟”主机,并且如果缺少 SNI,则会提供错误的证书或拒绝或失败连接。openssl s_client默认情况下不发送 SNI,但该选项-servername会发送;这在手册页中有描述。更新:1.1.1的OpenSSL在2018年s_client,现在默认发送SNI。

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