如何使用 openssl 命令/选项解释检查证书完整性和验证结果
目录
大家好。
我在系统解决方案部门工作,早上醒来就像世界末日一样痛苦。
这是继下面的文章之后关于如何使用 openssl 命令检查 SSL 证书的第二篇文章。
在上一篇文章中,我们重点检查了“到期日期”,这是有关证书最重要的信息。
颁发证书时,无论是新证书还是续订证书,检查其完整性都很重要。
关于如何使用 openssl 命令检查“一致性”的 1 点
申请完证书后,最好到证书颁发机构检查证书是否已经“验证”成功,所以
1分讲解如何使用openssl命令检查“验证”是否有问题
本文主要围绕以上两点,
《讲解使用openssl命令检查证书完整性和验证结果的方法和选项》以及
《为什么可以检查这个方法?》
我们将在“解释”的风格
这篇文章的立场是为那些不熟悉详细确认的人提供一个简单的解释。
执行环境
- ●Linux 环境
操作系统:AlmaLinux 版本 8.5(WSL2 环境)
Shell:Bash
OpenSSL 1.1.1k FIPS 2021 年 3 月 25 日 - ●Windows环境
操作系统:Windows11 Pro(版本:22H2)
将语言设置更改为日语
前言:证书安装流程
- 创建证书时,首先创建RSA私钥。
- 创建包含私钥中相应公钥的证书签名请求 (CSR)。
- 通过将 CSR 发送到证书颁发机构(中间证书的所有者)并
使用证书颁发机构的私钥对其进行数字签名来获得的。
通过在目标环境(LB、服务器等)中总共安装三项来完成: “证书”、“证书颁发机构证书(中间证书)”和带有数字签名有效的“私钥” *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”项之间可以进行一致性检查?
这是因为这些信息指向同一事物,只是项目名称不同。
证书的“颁发者”是证书颁发机构。
中间证书的“主体”……主体是认证机构。
这是正确的。换句话说,
检查“颁发证书的证书颁发机构”和“拥有中间证书的证书颁发机构”是否相同。
如果这两个哈希值匹配,则可以说“证书和中间证书的完整性”已经得到确认,没有任何问题。
●适用于Apache2.4.8或更高版本
SSLCertificateChainFile 指令已在 Apache 2.4.8 及更高版本环境中弃用。
因此,在 Apache conf 中,
指定了单个证书,该证书是“证书”和“证书颁发机构证书(中间 CA)”的组合。
申请证书时,
会颁发Apache 2.4.8以上版本的组合证书,所以基本不需要确认。
*例外:如果您的环境是 Apache 2.4.8 或更高版本,但证书是以不同的常规格式颁发的,您
将必须手动组合证书,但在此之前,请运行此操作作为预防性检查。
如何检查证书和私钥的“完整性”
证书和私钥的“完整性”是
通过检查两者所持有的信息模数
使用 openssl x509 命令。
使用 modulus 选项显示证书模数
此时,使用 md5sum 将其转换为短哈希值更容易进行比较。
openssl x509 -noout -modulus -in example.com.crt | openssl x509 -noout -modulus -in example.com.crt |
使用 openssl rsa 命令的 modulus 选项显示私钥的模数,并
类似地使用 md5sum 将其转换为短哈希值。
openssl rsa -noout -modulus -in example.com.key | md5sum
这时,就可以确认它们是一致的
x509-模数
证书中包含的模值作为子命令“x509”的选项输出。
RSA
处理 RSA 密钥时,请使用“openssl”命令的子命令“rsa”。
rsa 模数
子命令“rsa”的此选项输出密钥中包含的模值。
| md5 总和
这是一个使用哈希函数“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) 深度=2 C = IE,O = 巴尔的摩,OU = CyberTrust,CN = 巴尔的摩 CyberTrust 根验证返回:1 深度=1 C = US、O =“Cloudflare, Inc.”、CN = Cloudflare Inc ECC CA-3 验证返回:1 深度=0 C = US、ST = 加利福尼亚州、L = 旧金山、O =“Cloudflare, Inc.”、CN = sni.cloudflaressl.com 验证返回:1 --- 证书链 0 s:C = US、ST = 加利福尼亚州、L = 旧金山、O =“Cloudflare, Inc.”、CN = sni.cloudflaressl.com i:C = US、O =“Cloudflare, Inc.”、CN = Cloudflare Inc ECC CA-3 -----BEGIN CERTIFICATE----- 省略 -----END CERTIFICATE----- 1 s:C = US , O =“Cloudflare, Inc.”,CN = Cloudflare Inc ECC CA-3 i:C = IE,O = 巴尔的摩,OU = CyberTrust,CN = 巴尔的摩 CyberTrust 根 -----BEGIN CERTIFICATE---- 省略 - ----END CERTIFICATE---- 主要遗漏 验证返回码:0 (ok) --- DONE
-表演证书
显示使用 openssl 命令的子命令“s_client”选项从服务器发送的证书列表,以通过 SSL/TLS 进行通信。
即使您不使用此选项,也会显示下面的“验证返回代码”检查,但我使用它是因为它增加了有关证书的信息量。
检查要点
您应该在这里检查的底部的“验证返回代码”和“深度” 。
验证返回码
状态码表示验证状态。
- 如果“验证返回”为“0(ok)”,则没有问题。
但其他情况下,会根据问题中的代码号显示验证内容。
例如,“21(无法验证第一个证书)”(翻译:无法验证第一个证书)
表示问题可能出在中间证书,即从服务器证书跟踪的第一个证书。
还有其他选项例如“10(证书已过期)”(翻译:证书已过期),这
在查找问题时非常有用,因为它根据代码显示验证详细信息。
深度
它显示了证书的层次结构,
0 是服务器证书,1 是中间证书,2 是根证书。
・如果“深度”是“2”、“1”、“0”的正确序号,则证书的流程没有问题。
然而,如果全部为“0”,就有问题了。
这意味着没有创建层次结构(=没有建立证书链),
可以推断中间证书很可能存在问题。
在这种情况下,验证返回码很可能是 21。
谨防“中级证书误用”
我认为如果在应用之前检查证书和中间证书的“完整性”,一般不会有问题,但
在 Apache 2.4.8或更高版本中,由于已经统一,中间证书丢失的可能性越来越大。它将被应用。
●这会成为一个你没有立即注意到的麻烦情况。
这种“缺少中级证书”的情况是极其麻烦的。
在PC浏览器的情况下,“补充中间证书的功能”通常可以工作并且“可以查看该站点
另一方面,智能手机浏览器由于没有中间证书补充功能,经常会出现错误,很难查出原因。
即使检查证书中主要检查的“到期日期”和“域名”也没有问题,但
由于可以在 PC 上查看该网站,因此这是一个非常麻烦的情况,无法立即注意到问题。
事实上,了解这个案例的存在是我决定写这篇文章的主要原因。
如果出现“证书没有问题,但智能手机有问题”或“证书本身没有问题,但有错误”
,请使用上述命令检查根证书和中间证书是否正确如果没有任何问题,最好先检查一下。
最后
证书确认方法在业务中经常使用,所以记住它是非常有用的。
不过,我认为如果你不知道证书和SSL/TLS如何工作,有些部分很难理解,所以
我认为你可以通过单独学习系统来加深理解。
我希望这篇文章能为阅读它的人提供一些有用的知识。
参考资料
openssl-x509 的 OpenSSL 官方手册页
https://www.openssl.org/docs/manmaster/man1/openssl-x509.html
OpenSSL (ArchWiki)
https://wiki.archlinux.jp/index.php/OpenSSL