`openssl` 查看 X.509 证书内容详解 – wiki基地


深入解析 openssl:X.509 证书内容查看详解

引言

在数字世界中,信任的基石往往建立在加密和身份验证之上。X.509 证书正是这种信任机制的核心组成部分,它将公钥与身份(如域名、组织或个人)绑定,并通过权威机构(证书颁发机构 CAs)的签名来确保其真实性。无论是访问安全的网站、部署 HTTPS 服务、配置 VPN,还是进行代码签名,X.509 证书都无处不在。

然而,证书的内部结构和包含的信息对于非专业人士来说,可能显得晦涩难懂。当我们需要排查证书问题、验证其有效性、确认其用途,或是仅仅为了了解其详细信息时,openssl 这个强大的命令行工具便成为了我们的得力助手。

openssl 是一个多功能的开源工具包,提供了加密、证书管理和安全通信的各种功能。其中,openssl x509 子命令专门用于处理 X.509 证书,包括查看、修改、转换等操作。本文将聚焦于如何使用 openssl x509 详细查看证书内容,并深入解析其输出的每一部分。

一、X.509 证书基础概念回顾

在深入 openssl 命令之前,我们先快速回顾一下 X.509 证书的一些核心概念:

  1. 公钥基础设施 (PKI):PKI 是创建、管理、分发、使用、存储和撤销数字证书所需的一整套硬件、软件、人员、策略和规程。X.509 证书是 PKI 的核心产物。
  2. 证书颁发机构 (CA):受信任的第三方实体,负责核实申请者的身份并为其颁发数字证书。CA 会用自己的私钥对颁发的证书进行签名。
  3. 证书链 (Certificate Chain):通常,一个终端实体证书(如网站证书)并非直接由根 CA 签署,而是由中间 CA 签署,而中间 CA 又由上级 CA 签署,最终形成一个信任链,直到一个受操作系统或浏览器信任的根 CA。
  4. PEM 与 DER 格式
    • PEM (Privacy-Enhanced Mail):最常见的文本格式,以 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 为标记,内容是 Base64 编码的 DER 数据。易于传输和复制。
    • DER (Distinguished Encoding Rules):二进制格式,常用于 Java KeyStore 或其他二进制存储。传输时通常需要转换为 PEM 格式。

二、openssl x509 命令概述

openssl x509 命令是 openssl 工具集中专门用于处理 X.509 证书的子命令。它的基本语法是:

bash
openssl x509 [选项] [参数]

核心目标是读取一个 X.509 证书,并根据指定的选项对其进行处理或显示。

三、核心选项与常用用法

要查看证书内容,最常用也是最核心的选项是 -text

3.1 查看证书的文本内容 (-text)

这是查看证书最详细、最常用也最重要的选项。它将证书的二进制 DER 编码数据解析并以人类可读的文本格式输出。

基本语法:

bash
openssl x509 -in <证书文件> -text -noout

  • -in <证书文件>:指定输入证书的文件路径。
  • -text:指示 openssl 将证书内容以文本形式打印出来。
  • -noout:这是一个非常重要的选项。默认情况下,openssl x509 在处理完证书后,会将其原始的 PEM 或 DER 编码重新输出到标准输出。如果只想看文本解析结果而不希望看到原始编码,就必须加上 -noout

示例:

假设你有一个名为 server.pem 的证书文件:

bash
openssl x509 -in server.pem -text -noout

这将输出 server.pem 证书的所有可读信息。

3.2 指定输入格式 (-inform)

如果你的证书文件不是 PEM 格式,而是 DER 格式,你需要使用 -inform 选项指定输入格式。

语法:

bash
openssl x509 -in <证书文件> -inform DER -text -noout

  • -inform DER:指定输入文件是 DER 格式。

示例:

bash
openssl x509 -in server.der -inform DER -text -noout

3.3 快速获取特定信息

除了 -text 选项能显示所有细节外,openssl x509 还提供了一些便捷选项,用于快速提取证书的特定信息,而不显示整个文本:

  • -subject:显示证书的主体 (Subject) 信息。
    bash
    openssl x509 -in server.pem -subject -noout

    输出示例:subject=C = CN, ST = Beijing, L = Beijing, O = Example Corp, CN = www.example.com
  • -issuer:显示证书的颁发者 (Issuer) 信息。
    bash
    openssl x509 -in server.pem -issuer -noout

    输出示例:issuer=C = US, O = Let's Encrypt, CN = R3
  • -startdate:显示证书的生效日期 (Not Before)。
    bash
    openssl x509 -in server.pem -startdate -noout
  • -enddate:显示证书的过期日期 (Not After)。
    bash
    openssl x509 -in server.pem -enddate -noout
  • -serial:显示证书的序列号。 序列号在 CA 内部是唯一的,用于标识和撤销证书。
    bash
    openssl x509 -in server.pem -serial -noout

    输出示例:serial=xxxxxxxxxxxxxxxxxxxxxxxx (通常是十六进制表示)
  • -fingerprint / -sha1 / -sha256:计算证书的指纹(哈希值)。
    指纹是证书内容的哈希摘要,常用于快速验证证书的完整性或进行比较。fingerprint 通常默认使用 SHA1,而 sha1sha256 则明确指定算法。
    bash
    openssl x509 -in server.pem -fingerprint -noout
    openssl x509 -in server.pem -sha256 -noout

    输出示例:SHA256 Fingerprint=XX:XX:XX:...
  • -pubkey:提取证书中的公钥。
    它会输出证书中包含的公钥部分,通常以 PEM 格式显示。这对于检查公钥内容或将其用于其他加密操作很有用。
    bash
    openssl x509 -in server.pem -pubkey -noout
  • -modulus:显示证书公钥的模数。
    模数是 RSA 公钥的一部分,通常用于验证私钥是否与证书中的公钥匹配(如果私钥的模数与此证书的模数相同,则它们是匹配的)。
    bash
    openssl x509 -in server.pem -modulus -noout

3.4 检查证书有效期 (-checkend)

这个选项可以检查证书是否在指定秒数内过期,常用于自动化脚本中。

bash
openssl x509 -in server.pem -checkend <秒数> -noout

如果证书在指定秒数内过期,命令将返回非零退出码。

四、深度解析 -text 输出内容

现在,我们来详细剖析 openssl x509 -text -noout 命令的输出,这是理解证书内部构造的关键。以下是一个典型证书文本输出的结构,我们将逐一解释。

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Signature Algorithm: <算法名称,如: sha256WithRSAEncryption>
Issuer: C = US, O = Let's Encrypt, CN = R3
Validity
Not Before: <生效日期,如: Dec 1 00:00:00 2023 GMT>
Not After : <过期日期,如: Feb 29 23:59:59 2024 GMT>
Subject: C = CN, ST = Beijing, L = Beijing, O = Example Corp, CN = www.example.com
Subject Public Key Info:
Public Key Algorithm: <算法名称,如: RSA Public Key>
Public-Key: (<位长> bit)
Modulus:
00:xx:xx:xx:... (公钥模数)
Exponent: <指数,如: 65537 (0x10001)>
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Key Identifier:
xx:xx:xx:xx:... (主题公钥标识符)
X509v3 Authority Key Identifier:
keyid:xx:xx:xx:xx:... (颁发者公钥标识符)
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Subject Alternative Name:
DNS:www.example.com, DNS:example.com
X509v3 Certificate Policies:
Policy: 2.23.140.1.2.1
Policy: 1.3.6.1.4.1.44946.2.1
CPS: http://cps.letsencrypt.org/
Authority Information Access:
OCSP - URI:http://ocsp.int-x3.letsencrypt.org/
CA Issuers - URI:http://certs.letsencrypt.org/r3.pem
CRL Distribution Points:
Full Name:
URI:http://crl.rootsd.com/R3.crl
Signature Algorithm: <算法名称,与上方的签名算法一致>
<数字签名值>

4.1 Certificate: 段落

  • Data::这包含证书的所有主要信息。
  • Version::X.509 证书的版本号。
    • Version 1 (0x0):最基础版本,只包含核心字段。
    • Version 2 (0x1):增加了颁发者唯一标识符和主体唯一标识符,但很少使用。
    • Version 3 (0x2):当前最常用的版本,引入了“扩展 (Extensions)”的概念,极大地增强了证书的功能和灵活性。几乎所有现代证书都是 Version 3。
  • Serial Number::证书的唯一序列号。由 CA 生成,用于唯一标识一张证书。在证书吊销列表(CRL)中,通常通过序列号来标识被吊销的证书。
  • Signature Algorithm::用于签署此证书的哈希算法和公钥算法组合。例如 sha256WithRSAEncryption 表示使用 SHA-256 哈希算法对证书内容进行哈希,然后使用 RSA 算法和 CA 的私钥对哈希值进行签名。
  • Issuer: (颁发者):颁发此证书的实体的识别名 (Distinguished Name, DN)。通常包含:
    • C (Country):国家
    • ST (State/Province):省/州
    • L (Locality):城市
    • O (Organization):组织名称
    • OU (Organizational Unit):组织单位
    • CN (Common Name):通用名,通常是 CA 的名称。
  • Validity: (有效期)
    • Not Before::证书生效的日期和时间。在此时间之前,证书被认为是无效的。
    • Not After::证书失效的日期和时间。在此时间之后,证书被认为是无效的。
  • Subject: (主体):此证书所属的实体的识别名 (DN)。对于网站证书,CN 通常是网站的域名。对于组织或个人证书,则是其身份信息。
  • Subject Public Key Info: (主体公钥信息)
    • Public Key Algorithm::主体使用的公钥算法(如 RSA)。
    • Public-Key::公钥的位长(例如 2048 bit)。
    • Modulus::RSA 公钥的模数。
    • Exponent::RSA 公钥的指数(通常是 65537 或 3)。

4.2 X509v3 extensions: 段落

这是 X.509 v3 证书最强大和最灵活的部分,包含了额外的元数据和约束条件。很多安全特性都依赖于这些扩展。扩展可以标记为 critical(关键),这意味着如果应用程序不理解或不支持该扩展,则必须拒绝证书。

  • X509v3 Basic Constraints:
    • 如果 CA:TRUE,表示此证书是一个 CA 证书,可以用于签发其他证书。如果 CA:FALSE,则是一个终端实体证书,不能用于签发其他证书。
    • pathlen::对于 CA 证书,表示其可以签发下级证书的层级最大深度。
  • X509v3 Subject Key Identifier: (SKID):主体公钥的哈希值或唯一标识符。用于唯一标识证书中的公钥。
  • X509v3 Authority Key Identifier: (AKID):颁发者证书的公钥标识符。用于将此证书与签署它的 CA 证书关联起来,以构建证书链。它通常包含 keyid(CA 公钥的 SKID)或 serial(CA 证书的序列号)和 issuer
  • X509v3 Key Usage: (密钥用途):指定公钥可以用于哪些操作。常见的用途包括:
    • Digital Signature:数字签名。
    • Non Repudiation:不可否认性(通常与数字签名结合)。
    • Key Encipherment:密钥加密(用于加密会话密钥)。
    • Data Encipherment:数据加密。
    • Key Agreement:密钥协商。
    • Certificate Sign:用于签署其他证书(仅限 CA 证书)。
    • CRL Sign:用于签署 CRL(仅限 CA 证书)。
    • Encipher Only:仅用于加密。
    • Decipher Only:仅用于解密。
  • X509v3 Extended Key Usage: (扩展密钥用途,EKU):指定证书可以用于哪些特定应用程序或协议。常见的用途包括:
    • TLS Web Server Authentication:用于 HTTPS 服务器。
    • TLS Web Client Authentication:用于 HTTPS 客户端。
    • Code Signing:代码签名。
    • Email Protection:S/MIME 邮件加密/签名。
    • OCSP Signing:OCSP 响应签名。
  • X509v3 Subject Alternative Name: (SAN)
    • 这是最重要的扩展之一,尤其对于 Web 服务器证书。它允许一个证书绑定到多个域名 (DNS) 或 IP 地址。
    • 例如 DNS:www.example.com, DNS:example.com, IP Address:192.168.1.1
    • 现代浏览器在验证网站证书时,优先使用 SAN 字段而不是 Common Name (CN)。
  • X509v3 Certificate Policies: (证书策略):指定证书颁发所依据的策略,通常包含 OID(对象标识符)和可选的 CPS URI(认证实践声明 URI)或用户声明。这些策略定义了证书的发行条件和预期用途。
  • Authority Information Access: (AIA)
    • OCSP - URI::在线证书状态协议 (OCSP) 服务器的 URL。客户端可以通过访问此 URI 实时查询证书的吊销状态。
    • CA Issuers - URI::颁发此证书的 CA 证书的 URL。客户端可以使用此 URI 获取上一级 CA 证书,从而构建完整的证书信任链。
  • CRL Distribution Points: (CRLDP)
    • Full Name: / URI::证书吊销列表 (CRL) 的分发点 URL。客户端可以下载 CRL 来检查证书是否被吊销。

4.3 Signature Algorithm 与数字签名值

  • X509v3 extensions 之后,会再次列出Signature Algorithm,这与证书开头的签名算法一致。
  • 紧随其后的是数字签名值本身。这是 CA 使用其私钥对证书数据(除了签名本身之外的所有内容)进行签名后得到的结果。验证证书时,接收方会使用 CA 的公钥来解密此签名值,并与自己计算出的证书数据的哈希值进行比对。如果两者一致,则表示证书是真实且未被篡改的。

五、从网络连接中查看证书

在实际应用中,我们经常需要查看远程服务器(如 HTTPS 网站)的证书。openssl s_client 命令可以用于建立 SSL/TLS 连接,并显示服务器发送的证书。

语法:

bash
echo | openssl s_client -connect <主机名>:<端口> -showcerts | openssl x509 -text -noout

  • echo |:提供空输入,防止 s_client 挂起等待输入。
  • openssl s_client -connect <主机名>:<端口>:连接到指定主机和端口(通常是 443 用于 HTTPS)。
  • -showcerts:显示服务器发送的整个证书链。
  • | openssl x509 -text -noout:通过管道将 s_client 的输出传递给 x509 命令。s_client 输出的证书是 PEM 格式,可以直接被 x509 处理。

示例:

bash
echo | openssl s_client -connect www.google.com:443 -showcerts | openssl x509 -text -noout

此命令会显示 www.google.com 网站的服务器证书的详细信息。如果服务器发送了证书链,s_client 会打印出链中的所有证书,openssl x509 默认只会处理第一个(通常是服务器自身的)证书。若要查看链中所有证书,可以分多次查看或将 s_client 的输出保存到文件,然后手动分割。

六、常见问题与排查思路

  • “unable to load certificate” / “error:0909006C:PEM routines:get_name:no start line”:
    • 证书文件不存在或路径错误。
    • 证书文件不是 PEM 格式,但未指定 -inform DER
    • PEM 格式文件内容损坏,缺少 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 标记,或 Base64 编码错误。
  • PEM 与 DER 转换:
    • PEM 转 DER:openssl x509 -in cert.pem -outform DER -out cert.der
    • DER 转 PEM:openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
  • 证书过期问题:
    • 检查 Not BeforeNot After 字段。
    • 使用 -checkend 快速判断。
  • 域名不匹配问题:
    • 检查 Subject Common Name (CN)Subject Alternative Name (SAN) 字段。确保你的访问域名与其中之一匹配。通常 SAN 更为重要。
  • 证书链不完整:
    • openssl s_client -showcerts 可以帮助你查看服务器发送的证书链是否完整。如果缺少中间 CA 证书,客户端可能无法验证信任链。
  • CA 信任问题:
    • 即使证书本身有效,如果其颁发链上的任何 CA 不受操作系统或浏览器的信任,证书也会被视为无效。这需要将缺失的根或中间 CA 证书导入到系统的信任存储中。

七、总结

openssl x509 命令是理解和诊断 X.509 证书的强大工具。通过熟练掌握 -text 选项及其输出内容的解析,以及其他辅助选项如 -subject-issuer-fingerprint-pubkey 等,我们可以深入了解证书的每一个细节。这对于系统管理员、开发人员和任何需要处理数字证书的人来说都是一项必备技能。

从证书的版本、序列号到颁发者、主体、有效期,再到公钥信息和至关重要的 X.509v3 扩展(如 SAN、密钥用途、基本约束等),每一个字段都承载着特定的安全和策略信息。结合 openssl s_client,我们还能实时查看远程服务的证书信息,这在排查 TLS/SSL 连接问题时尤为关键。

掌握 openssl 的证书查看功能,不仅能帮助我们更好地管理和部署安全基础设施,更能提升我们对现代网络安全机制的理解。希望本文能为您在探索 X.509 证书的奥秘时提供一份详尽的指南。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部