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

大家好,
我是系统解决方案部门的Naka,对我来说,每天早上起床都像是世界末日。

本文是使用 openssl 命令检查 SSL 证书系列文章的第二篇,前一篇
重点介绍了如何检查证书的“过期日期”,这可能是证书最重要的考量因素。

如何使用 openssl 命令和选项检查证书到期日期

 

颁发证书时,无论是“新证书”还是“续期证书”,验证其“完整性”都至关重要。
以下是使用 openssl 命令验证“完整性”的一种方法。

应用证书后,最好检查一下证书是否已通过证书颁发机构的“验证”。因此,
我将解释如何使用 openssl 命令检查“验证”是否存在任何问题。

本文将重点讨论上述两点,
解释“如何使用 openssl 命令和可用选项检查证书完整性和验证结果”以及
“这些方法为什么有效

本文旨在为不熟悉检查细节的人们提供简单的解释。

执行环境

  • ●Linux 环境
    操作系统:AlmaLinux 8.5 版本(WSL2 环境)
    Shell:Bash
    OpenSSL 1.1.1k FIPS 25 2021年3月
  • ●Windows 环境
    :操作系统:Windows 11 专业版(版本:22H2)
    语言设置已更改为日语

简介:证书安装过程

  1. 创建证书时,首先要创建 RSA 私钥。
  2. 使用您的私钥创建证书签名请求 (CSR),其中包含相应的公钥。
  3. 证书签名请求 (CSR) 被发送到证书颁发机构(中间证书的所有者),
    证书颁发机构使用其私钥对文档进行数字签名后,该文档就成为“证书”。
  4. ,这三个文件分别是:具有数字签名有效性的“证书”、证书颁发机构证书(中间证书)和私钥
    目标环境(负载均衡器、服务器等)

 

*1. 在 Apache 2.4.8 及更高版本中,用于指定中间 CA 的 SSLCertificateChainFile 指令已被弃用。
因此,申请证书时,标准做法是申请将“证书”和“证书颁发机构证书(中间 CA)”合并到单个文档中的格式。

 

关于确认“截止日期”、“一致性”和“验证结果”

  1. 证书在安装和加载
    “到期日期”(证书)和“一致性”(所有三个文件共有的)验证必须
  2. 此外,安装完成后,需要检查“验证结果”,以确认证书是否已正确验证和认证(即证书链是否已建立)
    本文“完整性”和“验证结果将介绍如何检查

检查的原因在于,如果安装了错误的证书,网站显然无法正常运行。
在这种情况下,现代浏览器会显示警告,这可能会导致用户离开网站。

 

●关于文件扩展名

◯本文中使用的文件扩展名

• 证书 (.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 = Cyber​​Trust, CN = Baltimore Cyber​​Trust 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 = Cyber​​Trust, CN = Baltimore Cyber​​Trust 根证书 -----证书开始---- 已省略 -----证书结束---- 重大遗漏 验证返回码: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
加载中...
13票,平均分:1.00/113
25,788
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

里面

以中级员工的身份加入 Beyond 公司,
目前在系统解决方案部门工作。
我持有 LPIC-3 304 和 AWS SAA 认证。