如何使用 openssl 命令/选项说明检查证书的过期日期
你好。我是 Beyond System Solutions 部门的成员。
您正在查看的这个 Beyond Blog 使用 HTTPS。
在过去的十年里,HTTPS 已经普及,HTTP 站点的数量大幅减少。
目前HTTPS转换所需的“SSL证书”一般每年都会更新一次,所以需要定期进行更新工作,但
到时候检查SSL证书的有效期我想很多人都会用浏览器来检查。
不过,我觉得有一些人用命令来检查是因为浏览器不确定,或者是因为正在开发,无法对外开放端口,所以
我觉得还是有人用命令来检查,但只是偶尔会出现一定的问题。搜索未使用的命令时发生。
“命令用法和选项因人而异,但有什么区别呢?”
“就算打了人,也有很多选项我看不懂。”
对于这样的人,我想解释一下在检查 SSL 证书时经常与 openssl 命令一起使用的选项的含义和用法。
执行环境
・操作系统:AlmaLinux8(WSL2 环境)
・Shell:bash
・OpenSSL:OpenSSL 1.1.1k FIPS 2021 年 3 月 25 日
使用 openssl 命令检查“本地”或“远程”
openssl命令是OpenSSL项目开发并发布的命令,是大多数主流Linux发行版中默认可以使用的命令。
该命令可以做很多事情,但这次我们将使用它来检查 SSL 证书的到期日期。
另外,使用该命令进行检查时,有两种方法:“本地检查 SSL 证书”和“从外部远程检查 SSL 证书”。
首先,我将解释前者,本地。
当地环境
下面是我在查看本地环境时经常使用的命令。
openssl命令用于读取本地存储的证书并显示公用名称、有效开始日期和到期日期。
$ openssl x509 -noout -subject -dates -in /etc/pki/tls/certs/example.crt
*输出样本主题=CN = exmaple.com *通用名(≒域名) notBefore=Mar 31 04:42:17 2022 GMT *有效开始日期 notAfter=May 2 04:42:16 2023 GMT *到期日期
x509
处理 SSL 证书时,请使用“openssl”命令中的子命令“x509”。
*“X.509”是公钥证书标准格式的名称,因此将其与之关联起来可能会更容易记住。
-在
在本地环境中运行时,需要指定要加载的证书名称,因此使用该选项。
-主题
此选项从导入的证书中输出主题字段(其中写入通用名称)。
-日期
此选项输出导入证书的有效开始日期和到期日期。
-noout
该选项“防止输出其他选项中指定的信息以外的信息”。
如果不存在此选项,则还将显示通过以下命令加载的未解密证书。
-----BEGIN CERTIFICATE----- MIIGMjCCBRqgAwIBAgIMMGPvI3CXFUjGngZcMA0GCSqGSIb3DQEBCwUAMEwxCzAJ BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSIwIAYDVQQDExlB ~以下几十行省略~ -----END CERTIFICATE -----
顺便说一句,还有一个 -nocert 选项,仅限于不显示证书的内容。
远程环境
以下是我远程检查时经常使用的命令。
我使用 openssl s_client 命令访问目标主机,从那里读取证书,并显示公用名称、有效开始日期和到期日期。
$openssl s_client -connect Beyondjapan.com:443 < /dev/null 2> /dev/null | openssl x509 -noout -subject -dates
*实际输出主题=CN = Beyondjapan.com notBefore=Mar 31 04:42:17 2022 GMT notAfter=May 2 04:42:16 2023 GMT
s_client
使用提供与 SSL/TLS 通信时所需的客户端功能的子命令。
-连接主机:端口
它是远程选项(指定要连接的主机和端口),就像您在本地使用 -in 来指定文件一样。
*这次我们使用 443 (HTTPS),但您也可以指定端口(例如 SMTP)并使用它来检查 SSL/TLS 连接。
< /dev/空
“openssl s_client”命令连接到指定的目的地,然后进入“输入等待状态”,因此我在标准输入中不放置任何内容(/dev/null)并结束输入等待状态。
如果我不使用这个,我必须使用ctrl+c来结束命令,所以我使用它。
*这不是一个选项,而是有关 shell 标准输入的规范(在此环境中为 bash)。
2> /dev/空
这会将 Linux 上的标准错误输出 (2) 输出为空 (/dev/null) 并丢弃它,以便它不会显示在 shell 上。
如果上一步使用了</dev/null,会出现不必要的错误语句,所以这是消除它。
*这不是一个选项,而是有关 shell 标准输出的规范(在此环境中为 bash)。
| openssl x509 -noout -主题 -日期
使用“|”(管道)将通过通信接收到的 SSL 证书的内容传递给读取它的命令。
pipeline 之后的命令与本地时几乎相同,但由于证书是通过管道接收的,因此不使用 -in 选项来指定要读取的证书。
*如果未指定-in选项,则该命令(x509)的规格是处理传递到标准输入的内容。
其他人使用的命令和选项
命令
回声 | openssl s_client -connect ~
在检查远程环境时,我使用 < /dev/null 来结束等待输入,但是
使用 echo 优先在 shell 上输出标准输出的命令,强制输入似乎处于等待状态。
意图与 < /dev/null 相同。
〜| openssl x509 -text | grep“不”
-text 选项解密证书的所有内容并将其输出为文本。
这包括与其他选项单独指定和显示的所有内容,因此当您想要检查所有内容时使用此选项。
输出通过管道传输到 grep 并输出包含“Not”的行。
$ openssl s_client -connect Beyondjapan.com:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not" 不早于:2022 年 3 月 31 日 04:42:17 GMT 不晚于:5 月 2 日2023 年 42:16(格林尼治标准时间)
像这样输出有效的开始日期和到期日期行。
该命令虽然很长,但是很简单,所以我想对于了解该命令的人来说很容易理解。
然而,即使有专用选项,依赖 grep
意味着我对选项的研究不多,而且我对 openssl 命令的理解也没有进步,所以我决定使用我建议的第一个命令。
此外,如果尝试输出域名(通用名),由于使用正则表达式选项,命令的可读性会变差,这是一个问题。
选项
-结束日期
该选项仅显示导入证书的到期日期。
还有一个名为 -startdate 的选项,它类似地显示有效开始日期,但
由于 -dates 选项同时应用这两个选项,因此如果您没有任何特别的担忧,我认为 -dates 很好。
-文本
如上所述,这是一个以文本格式显示证书的选项。
输出包括所有设置信息,例如公钥、签名算法、发行者、主体名称、到期日期等。
没有 -noout 的模式
在这种情况下,命令请求的未解密证书将按原样显示,后跟可选的到期日期等。
老实说,您将无法看到尚未解密的证书的内容,因此更容易查看它是否已附加。
命令的输出中出现了“CERTIFICATE”一词,因此您可以清楚地看到证书正在验证,因此这可能是一个优势。
< /dev/null 2> 不带 /dev/null 的模式
它基于这样的假设:你可以用 ctrl + c 结束命令,而且手动输入似乎更容易,而且一目了然,所以我认为这就是意图。
我觉得这是我的偏好,但
我喜欢这种模式,因为有时
最后
当我写这篇文章时,我想起 openssl 命令可以做很多事情,而且它也有很多选项,所以它可能会非常令人困惑。
这只是其中的一小部分,而作为核心技术的加密和认证方法领域本身就具有极高的逻辑性和深刻性。
我希望通过阅读本文,您能够消除对 openssl 命令的任何犹豫或疑虑!
感谢您阅读本文。
下一篇
以下是如何检查“一致性/验证结果”的说明,这些结果通常与“到期日期”一起检查
如何使用 openssl 命令/选项解释检查证书完整性和验证结果
参考资料
openssl-x509 的 OpenSSL 官方手册页
https://www.openssl.org/docs/manmaster/man1/openssl-x509.html
OpenSSL (ArchWiki)
https://wiki.archlinux.jp/index.php/OpenSSL