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

目录
大家好。
我在系统解决方案部门工作,每天醒来都感觉世界末日要来了。
这是关于使用 openssl 命令检查 SSL 证书系列文章的第二篇,本文是继下文之后的一篇。
上一篇文章重点介绍了如何检查“过期日期”,这可能是检查证书时最重要的考虑因素。
颁发证书时,无论是新证书还是续期证书,都必须检查其完整性。
以下将介绍如何使用 openssl 命令检查证书完整性。
申请证书后,最好检查一下证书是否已通过证书颁发机构的“验证”。因此,
解释如何使用 openssl 命令检查“验证”是否存在问题,将获得 1 分。
本文将重点讨论以上两点,并
解释使用 openssl 命令检查证书完整性和验证结果的选项和方法,
以及为什么可以使用此方法验证证书
。
本文旨在为不熟悉检查细节的人们提供简单的解释。
执行环境
- ●Linux 环境
操作系统:AlmaLinux 8.5 版本(WSL2 环境)
Shell:Bash
OpenSSL 1.1.1k FIPS 25 2021年3月 - ●Windows 环境
:操作系统:Windows 11 专业版(版本:22H2)
将语言设置更改为日语
简介:证书安装过程
- 创建证书时,首先要创建 RSA 私钥。
- 使用您的私钥创建证书签名请求 (CSR),其中包含相应的公钥。
- CSR 被发送给证书颁发机构(中间证书的所有者),
一旦使用证书颁发机构的私钥对其进行数字签名,它就成为“证书”。 - 经数字签名验证有效的“证书”、证书颁发机构的证书(中间证书)和“私钥”
。*1
*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模块)的数字
用于计算的两种类型的数字
这里需要注意的是,私钥也包含与公钥相同的数值。
换句话说,如果两个密钥所持有的 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