将“-servername”参数与 openssl s_client 一起使用

Posted

技术标签:

【中文标题】将“-servername”参数与 openssl s_client 一起使用【英文标题】:Using '-servername' param with openssl s_client 【发布时间】:2017-10-02 19:11:33 【问题描述】:

我正在 Centos6/Apache 上安装新的 SSL 证书,而我的 Web 浏览器不断获取旧证书。为了测试我的设置,我使用了“openssl s_client”,但我看到了基于“-servername”参数的不同结果。在我们看来,没有人认为这个参数也没有出现在手册页中,但我看到这里提到了 OpenSSL: Check SSL Certificate Expiration Date and More 。

如果我运行这个命令:

echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

我得到了正确的证书日期。

(notBefore=2017 年 4 月 20 日 00:00:00 GMT notAfter=2018 年 4 月 20 日 23:59:59 GMT)

但是,如果我将 -servername 参数插入命令中

echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

然后我会得到我的浏览器显示的过期日期 -

(notBefore=2016 年 4 月 20 日 00:00:00 GMT notAfter=2017 年 4 月 20 日 23:59:59 GMT)

谁能解释为什么会发生这种情况,因为这一定与我的 SSL 证书在我的浏览器中显示为过期的原因有关。

谢谢 哦

【问题讨论】:

Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops? 您通常需要将-tls 开关之一与-servername 一起使用。 SNI 是 TLS 1.0(及更高版本)扩展。 【参考方案1】:

s_client 的 servername 参数记录在此页面上(简要地):

https://www.openssl.org/docs/man1.0.2/apps/s_client.html

本质上,它的工作方式有点像 HTTP 中的“主机”标头,即它导致请求的域名作为 SSL/TLS 握手的一部分(在 SNI - 服务器名称指示扩展中)传递。然后,服务器可以在单个 IP 后面托管多个域。它将根据请求的域名使用适当的证书进行响应。

如果您不请求特定域名,服务器不知道该给您哪个证书,因此您最终会得到一个默认证书。在您的情况下,服务器为您的域提供的证书之一已过期,但默认证书尚未过期。

您需要确保为您的域更新正确的 VirtualHost 条目,例如见:

https://www.digicert.com/ssl-support/apache-multiple-ssl-certificates-using-sni.htm

【讨论】:

谢谢马特——这正是我需要的答案。我查看了您发送给我的手册页链接,如果没有您的解释,我仍然会摸不着头脑。再次感谢! 太棒了!很高兴你把事情解决了。请您将我的答案标记为正确吗?

以上是关于将“-servername”参数与 openssl s_client 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Linux-SSL和SSH和OpenSSH,OpenSSL有啥区别

PHP imap_open(),OpenSSL,并且没有密码

openssl 中 -nodes 参数的目的是啥?

心脏滴血漏洞搭建与复现修复(CVE-2014-0160)OpenSSL Heartbleed漏洞

将 OpenSSL 与 webassembly 链接

VirtualHost 相同的 ServerName 不同的目录