如何使用 openssl 命令和选项检查证书完整性和验证结果

目录
大家好,
我是系统解决方案部门的Naka,对我来说,每天早上起床都像是世界末日。
本文是使用 openssl 命令检查 SSL 证书系列文章的第二篇,前一篇
重点介绍了如何检查证书的“过期日期”,这可能是证书最重要的考量因素。
颁发证书时,无论是“新证书”还是“续期证书”,验证其“完整性”都至关重要。
以下是使用 openssl 命令验证“完整性”的一种方法。
应用证书后,最好检查一下证书是否已通过证书颁发机构的“验证”。因此,
我将解释如何使用 openssl 命令检查“验证”是否存在任何问题。
本文将重点讨论上述两点,
解释“如何使用 openssl 命令和可用选项检查证书完整性和验证结果”以及
“这些方法为什么有效
。
本文旨在为不熟悉检查细节的人们提供简单的解释。
执行环境
- ●Linux 环境
操作系统:AlmaLinux 8.5 版本(WSL2 环境)
Shell:Bash
OpenSSL 1.1.1k FIPS 25 2021年3月 - ●Windows 环境
:操作系统:Windows 11 专业版(版本:22H2)
语言设置已更改为日语
简介:证书安装过程
- 创建证书时,首先要创建 RSA 私钥。
- 使用您的私钥创建证书签名请求 (CSR),其中包含相应的公钥。
- 证书签名请求 (CSR) 被发送到证书颁发机构(中间证书的所有者),
证书颁发机构使用其私钥对文档进行数字签名后,该文档就成为“证书”。 - ,这三个文件分别是:具有数字签名有效性的“证书”、证书颁发机构证书(中间证书)和私钥
目标环境(负载均衡器、服务器等)
*1. 在 Apache 2.4.8 及更高版本中,用于指定中间 CA 的 SSLCertificateChainFile 指令已被弃用。
因此,申请证书时,标准做法是申请将“证书”和“证书颁发机构证书(中间 CA)”合并到单个文档中的格式。
关于确认“截止日期”、“一致性”和“验证结果”
- 证书在安装和加载,
其“到期日期”(证书)和“一致性”(所有三个文件共有的)验证必须 - 此外,安装完成后,需要检查“验证结果”,以确认证书是否已正确验证和认证(即证书链是否已建立)
本文。“完整性”和“验证结果将介绍如何检查
检查的原因在于,如果安装了错误的证书,网站显然无法正常运行。
在这种情况下,现代浏览器会显示警告,这可能会导致用户离开网站。
●关于文件扩展名
◯本文中使用的文件扩展名
• 证书 (.crt)
• 中间 CA 证书 (.ca)
• 私钥 (.key)
使用 openssl 命令检查“完整性”。
抱歉让您久等了,现在我们进入正题:如何验证完整性。
我们将使用大家熟悉的 openssl 命令来检查完整性。
“证书和中间证书”与“证书和私钥”的验证方法不同,但
两者都在安装过程中执行,因此都在生产环境中执行。
如何检查证书和中间证书(=中间CA证书)的完整性
issuer_hash 选项显示证书“颁发者”信息的哈希值
openssl x509 -issuer_hash -noout -in example.com.crt
subject_hash 选项显示中间证书“主题”信息的哈希值。
openssl x509 -subject_hash -noout -in example.com.ca
在这种情况下,如果两个值完全相同,则可以确认一致性。
x509
处理 SSL 证书时,请使用“openssl”命令的“x509”子命令。
*“X.509”是公钥证书的标准格式名称,所以如果你把它与某些东西联系起来,就很容易记住。
-在
使用此选项是因为您需要指定要加载的证书的名称。
-issuer_hash
显示证书中颁发者信息的哈希值。
-主题哈希
显示证书中的哈希主题信息
●为什么能够确认具有不同“issuer_hash”和“subject_hash”的项目之间的一致性?
这是因为这些信息最终指的是同一件事,只是名称不同而已。
证书的“签发者”是证书颁发机构。
中级证书的“主体”指的是证书颁发机构。
没错。换句话说,
他们是在检查“颁发证书的证书颁发机构”和“拥有中间证书的证书颁发机构”是否是同一机构。
如果这两个哈希值匹配,则可以说“证书和中间证书的完整性”已得到确认,没有任何问题。
适用于 Apache 2.4.8 或更高版本
在 Apache 2.4.8 或更高版本的环境中,SSLCertificateChainFile 指令已被弃用。
因此,在 Apache 配置文件中,
指定了一个证书,该证书结合了“证书”和“证书颁发机构证书(中间 CA)”。
申请证书时,
您将获得一个适用于 Apache 2.4.8 及更高版本的联合证书,因此通常不需要验证。
*例外情况:如果您使用的是 Apache 2.4.8 或更高版本,但证书是以不同的旧格式颁发的,则
需要手动合并这些证书。不过,此步骤仅作为预防性检查。
如何检查证书和私钥的“完整性”
证书和私钥之间的“一致性”
(两者都保存的信息)是否相同来模数”是通过检查
使用 openssl x509 命令。
模数选项显示证书的模数;
使用 md5sum 将其转换为短哈希值可以更轻松地进行比较。
openssl x509 -noout -modulus -in example.com.crt | md5sum
openssl rsa 命令的 modulus 选项显示私钥的模数,
类似地,md5sum 将其转换为短文本哈希值。
openssl rsa -noout -modulus -in example.com.key | md5sum
在这种情况下,如果两个值完全相同,则可以确认一致性。
x509 模数
子命令“x509”选项输出证书中包含的模值。
rsa
使用 RSA 密钥时,请使用“openssl”命令的“rsa”子命令。
rsa模量
这是子命令“rsa”的一个选项,用于输出密钥中包含的模值。
| md5sum
这是一个使用哈希函数“MD5”执行计算的命令,在本例中,它对通过管道传递的模数信息进行哈希处理。
●为什么“模数”相同的值可以验证一致性?
此模数选项显示“RSA 模块”,它是 RSA 加密格式中使用的数字之一。
解释起来太长了,所以我只做个简要说明。在RSA加密方法中,
- 只有私钥才拥有的数字
- 一个包含公钥(此处包含RSA模块)的数字
值有两种类型,
计算(HTTPS 中的数字签名和签名验证)都是使用这些值进行的。
重要的是,私钥也包含公钥的数值。
换句话说,如果两个密钥所持有的 RSA 模块相同,则可以确认公钥和私钥是一对(即,它们是一致的)。
●为什么证书即使不是公钥也能输出模数?
这是因为证书是一种包含公钥的机制。
使用此证书中嵌入的公钥,我们开始通过 HTTPS 加密通信的过程。
CSR 是通过一条命令从私钥创建的,因此在操作时很难注意到,但从系统角度来看,CSR(和证书)包含公钥。
*本文仅是一种验证方法,因此我们不会详细解释其原理。
使用 openssl 命令向证书颁发机构检查“验证结果”。
这是为了检查根证书、中间证书和证书是否正常工作(证书链是否已建立)。
在上一篇文章中,我们使用 openssl s_client 连接,并检查了当时获得的证书的内容(到期日期)。
这次,我们将向您展示如何以正常方式使用它,即连接并输出通信状态日志以诊断状态。
$ openssl s_client -connect beyondjapan.com:443 -showcerts < /dev/null CONNECTED(00000003) depth=2 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root verify return:1 depth=1 C = US, O = "Cloudflare, Inc.", CN = Cloudflare Inc ECC CA-3 verify return:1 depth=0 C = US, ST = California, L = San Francisco, O = "Cloudflare, Inc.", CN = sni.cloudflaressl.com verify return:1 --- 证书链 0 s:C = US, ST = California, L = San Francisco, O = "Cloudflare, Inc.", CN = sni.cloudflaressl.com i:C = US, O = "Cloudflare, Inc.", CN = Cloudflare Inc ECC CA-3 -----BEGIN CERTIFICATE------ Omitted -----END证书---- 1 s:C = US, O = "Cloudflare, Inc.", CN = Cloudflare Inc ECC CA-3 i:C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust 根证书 -----证书开始---- 已省略 -----证书结束---- 重大遗漏 验证返回码:0(正常) --- 完成
-showcerts
openssl 命令的子命令“s_client”的此选项用于通过 SSL/TLS 进行通信,它会显示服务器发送的证书列表。
即使不使用此选项,下面的“验证返回代码”仍然会显示,但我使用它是因为它可以增加有关证书的信息量。
需要检查的事项
你应该检查的底部的“验证返回码”和“深度”。
验证返回码
状态码指示验证状态。
- 如果“验证返回”为“0(确定)”,则没有问题。
但是,在其他情况下,验证详情将根据问题中的代码编号显示。
例如,如果您看到“21(无法验证第一个证书)”,
则可能表示中间证书存在问题,中间证书是从服务器证书追溯到的第一个证书。
其他选项包括“10(证书已过期)”(翻译:证书已过期),
它会根据代码显示验证详细信息,这在查找问题时非常有用。
深度
这表示证书层次结构,
其中 0 为服务器证书,1 为中间证书,2 为根证书,按此顺序排列。
- 如果“深度”按顺序正确编号为“2”、“1”和“0”,则证书流不会出现问题。
但是,如果所有值均为“0”,则会出现问题。
这表明尚未创建层次结构(即,尚未建立证书链),并且
中间证书很可能存在问题。
在这种情况下,验证返回码很可能是 21。
警惕“缺少中间证书”
如果在应用证书和中间证书之前验证它们的“一致性”,应该不会出现任何重大问题,但是
从 Apache 2.4.8 及更高版本开始,统一化增加了应用证书时“缺少中间证书”的可能性。
●它可能发展成一种你可能不会立即注意到的棘手疾病。
缺少中间证书的情况非常麻烦。
在 PC 浏览器上,“中间证书补全功能”或“缓存中存储的中间证书”您能够查看网站通常可以正常工作,
另一方面,在使用智能手机浏览器时,由于缺乏中间证书补全功能,经常会出现错误,这使得找出错误原因变得困难。
证书本身没有显示任何问题,包括“到期日期”和“域名”,而且
该网站可以在电脑上访问,这使得问题“不明显”的情况变得非常棘手。
事实上,正是因为了解到这个案例的存在,我才决定写这篇文章。
如果您遇到“证书没问题,但只有我的智能手机运行异常”或“证书本身没问题,但我收到错误”之类的问题,
您应该首先使用上面的命令检查根证书和中间证书是否正常工作。
最后
证书验证方法在商业中非常常用,因此记住它非常有用。
但是,如果您不熟悉证书和 SSL/TLS 机制,某些部分可能难以理解,因此
单独学习该机制将加深您的理解。
我希望这篇文章对读者有所帮助。
参考资料
OpenSSL 官方手册中关于 openssl-x509 的部分
位于 https://www.openssl.org/docs/manmaster/man1/openssl-x509.html
OpenSSL (ArchWiki)
https://wiki.archlinux.jp/index.php/OpenSSL
13
