验证证书链

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

本文档介绍如何在将证书上传到 Apigee Edge 中的密钥库或信任库之前验证证书链。该过程依靠 OpenSSL 工具包来验证证书链,适用于任何提供 OpenSSL 的环境。

准备工作

在使用本文档中的步骤之前,请务必了解以下主题:

  • 如果您不熟悉证书链,请参阅信任链
  • 如果您不熟悉 OpenSSL 库,请参阅 OpenSSL
  • 如果要使用本指南中的命令行示例,请安装或更新到最新版本的 OpenSSL 客户端。
  • 确保证书采用 PEM 格式。如果证书未采用 PEM 格式,请按照 将证书转换为受支持的格式中的说明将其转换为 PEM 格式。

验证完整链的证书主题和颁发者

如需使用 OpenSSL 命令验证证书链,请完成以下部分中所述的步骤:

拆分证书链

在验证证书之前,您需要按照以下步骤将证书链拆分为单独的证书:

  1. 登录 OpenSSL 客户端所在的服务器。
  2. 将证书链拆分为以下证书(如果尚未拆分):
    • 实体证书entity.pem
    • 中间证书intermediate.pem
    • 根证书root.pem

下图展示了一个证书链示例:

证书链流程:从身份证书到中间证书再到根证书

验证证书主题和颁发者

本部分介绍如何获取证书的主题和颁发者,并验证您是否拥有有效的证书链。

  1. 运行以下 OpenSSL 命令,获取从 entityroot 链中每个证书的 SubjectIssuer,并验证它们是否形成了正确的证书链:
    openssl x509 -text -in certificate | grep -E '(Subject|Issuer):'
        

    其中 certificate 是证书的名称。

  2. 验证链中的证书是否遵循了以下准则:
    • 每个证书的 Subject 都与链中前一个证书的 Issuer 匹配(Entity 证书除外)。
    • 根证书的 SubjectIssuer 是相同的。

    如果证书链中的证书符合这些准则,便会被视为完整且有效。

    证书链验证示例

    以下示例是包含三个证书的示例证书链的 OpenSSL 命令输出:

    实体证书

    openssl x509 -text -in entity.pem | grep -E '(Subject|Issuer):'
    
    Issuer: C = US, O = Google Trust Services, CN = GTS CA 1O1
    Subject: C = US, ST = California, L = Mountain View, O = Google LLC, CN = *.enterprise.apigee.com
            

    中间证书

    openssl x509 -text -in intermediate.pem  | grep -E '(Subject|Issuer):'
    
    Issuer: OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
    Subject: C = US, O = Google Trust Services, CN = GTS CA 1O1
            

    根证书

    openssl x509 -text -in root.pem | grep -E '(Subject|Issuer):'
    
    Issuer: OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
    Subject: OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
            

    在上述示例中,请注意以下几点:

    • 中间证书的 Subject 与实体证书的 Issuer 匹配。
    • 根证书的 Subject 与中间证书的 Issuer 匹配。
    • 根证书中的 SubjectIssuer 相同。

    从上面的示例中,您可以确认示例证书链是否有效。

验证证书主题和颁发者哈希

本部分介绍如何获取证书的主题和颁发者的哈希值,并验证您是否拥有有效的证书链。

验证证书的哈希序列始终是一种很好的做法,因为这有助于发现证书的通用名称 (CN) 包含多余的空格或特殊字符等问题。

  1. 运行以下 OpenSSL 命令,获取从 entityroot 链中每个证书的 hash 序列,并验证它们是否形成了正确的证书链。
  2. openssl x509 -hash -issuer_hash -noout -in certificate
        

    其中 certificate 是证书的名称。

  3. 验证链中的证书是否遵循以下准则:
    • 每个证书的 Subject 都与链中前一个证书的 Issuer 匹配(Entity 证书除外)。
    • 根证书的 SubjectIssuer 是相同的。

    如果证书链中的证书遵循这些准则,则会被视为完整且有效。

    通过哈希序列进行证书链验证的示例

    以下示例是包含三个证书的示例证书链的 OpenSSL 命令输出:

    openssl x509 -in entity.pem -hash -issuer_hash -noout
    c54c66ba #this is subject hash
    99bdd351 #this is issuer hash
        
    openssl x509 -in intermediate.pem -hash -issuer_hash -noout
    99bdd351
    4a6481c9
        
    openssl x509 -in root.pem -hash -issuer_hash -noout
    4a6481c9
    4a6481c9
        

    在上述示例中,请注意以下几点:

    • 中间证书的 subject hash 与实体证书的 issuer hash 匹配。
    • 根证书的 subject hash 与颁发者证书的 issuer hash 匹配。
    • 根证书中的 subjectissuer hash 相同。

    从上面的示例中,您可以确认示例证书链是否有效。

验证证书是否过期

本部分介绍如何使用以下方法验证链中的所有证书是否都已过期:

  • 获取证书的开始日期和结束日期。
  • 获取到期状态。

开始日期和结束日期

运行以下 OpenSSL 命令,获取从 entityroot 链中每个证书的开始日期和结束日期,并验证链中的所有证书是否有效(开始日期在今天之前)且未过期。

涵盖开始日期和结束日期的证书示例

openssl x509 -startdate -enddate -noout -in entity.pem
notBefore=Feb  6 21:57:21 2020 GMT
notAfter=Feb  4 21:57:21 2021 GMT
openssl x509 -startdate -enddate -noout -in intermediate.pem
notBefore=Jun 15 00:00:42 2017 GMT
notAfter=Dec 15 00:00:42 2021 GMT
openssl x509 -startdate -enddate -noout -in root.pem
notBefore=Apr 13 10:00:00 2011 GMT
notAfter=Apr 13 10:00:00 2022 GMT

到期状态

运行以下 OpenSSL 命令,检查证书是否已过期或即将在下一个 N seconds 后过期。该方法会返回证书的失效状态(以当前系统日期为准)。

openssl x509 -checkend <N Seconds> -noout -in certificate

其中 certificate 是证书的名称。

通过 checkend 选项进行证书过期验证的示例

以下命令使用 0 seconds 检查证书是否已经过期:

openssl x509 -checkend 0 -noout -in entity.pem
Certificate will not expire
openssl x509 -checkend 0 -noout -in intermediate.pem
Certificate will not expire
openssl x509 -checkend 0 -noout -in root.pem
Certificate will not expire

在此示例中,消息 Certificate will not expire 表示证书尚未过期。