AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 778504
Accepted
David Tonhofer
David Tonhofer
Asked: 2024-06-17 23:19:57 +0800 CST2024-06-17 23:19:57 +0800 CST 2024-06-17 23:19:57 +0800 CST

可能有点问题:“openssl x509”有时将序列号显示为八位字节字符串,有时显示为整数

  • 772

我注意到,openssl x509 -in $FILE -text有时会显示X.509 证书的序列号(一个最多 20 字节的正整数,因此最高有效位为 0),有时会显示为“八位字节字符串”,有时会显示为整数,后面跟着十六进制表示形式。

例如,这是“Letsencrypt”链中证书的序列号(16 字节序列号,但 MSB 为 1,有什么问题吗?):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            91:2b:08:4a:cf:0c:18:a7:53:f6:d6:2e:25:a7:5f:5a
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1

这是来自系统“证书包”的证书(8 字节序列号,MSB 为 0)

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 6828503384748696800 (0x5ec3b7a6437fa4e0)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=ACCVRAIZ1, OU=PKIACCV, O=ACCV, C=ES

来自同一捆绑包的另一个(16 字节序列号,MSB 为 0):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA

证书QuoVadis Root CA 2(2字节序列号):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1289 (0x509)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=BM, O=QuoVadis Limited, CN=QuoVadis Root CA 2

这是一个具有 9 字节序列号的序列号(MSB 正确为 0):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            11:00:34:b6:4e:c6:36:2d:36
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=RO, O=CERTSIGN SA, OU=certSIGN ROOT CA G2

另一个来自同一提供商的证书带有 6 字节序列号:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 35210227249154 (0x200605167002)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RO, O=certSIGN, OU=certSIGN ROOT CA

看起来有点随机。打印序列号有两种方式有什么特殊意义吗?

openssl
  • 1 1 个回答
  • 794 Views

1 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2024-06-18T00:09:29+08:002024-06-18T00:09:29+08:00

    这只是打印序列号的风格选择。源代码openssl x509 -text中的逻辑是:

    • 如果序列号较小,则将其以十进制和十六进制数字打印,并-在负数前加前导。
    • 如果序列号很大,则将其打印为以冒号分隔的两个十六进制数字块列表,并在末尾添加 (Negative)负数。

    决定其大小的是序列号的绝对值:小序列号在 64 位系统上严格小于 2^63,在 32 位系统上严格小于 2^31(sizeof(long)这才是最重要的)。

    “序列号”实际上应该是一个八位字节字符串,因为它只是一个唯一标识符,从不用作数字。但它很久以前在 X.509 语法中被指定为整数,因此它被编码为整数。语法允许它是负整数,但语义禁止这样做。相反,语法阻止仅在前导零八位字节数上不同的序列号。

    最高有效位为 0

    不完全是。RFC 5280含糊不清:它说“证书用户必须能够处理最多 20 个八位字节的 serialNumber 值”,但序列号是整数,而不是八位字节字符串,并且整数没有八位字节数。有两种合理的解释:

    • 这可能意味着(正)值必须适合 20 个八位字节,因此整数介于 1 和 (2^8)^20-1 = 2^160-1 之间。
    • 这可能意味着整数编码的有效载荷(包括符号位)必须适合 20 个八位字节,因此整数介于 1 和 (2^8)^20/2-1 = 2^159-1 之间。

    根据第二种解释, 20 个八位字节值的最高有效位必须为 0。例如,序列号在 (2^8)^16/2 和 (2^8)/16-1 之间是完全没问题的,就像 ISRG Root X1 签名的 Letsencrypt 证书中那样。

    您可能误解了INTEGER 编码的限制,将其视为值的限制。在 INTEGER 编码中,第一个八位字节的最高位是符号位。这意味着序列号 0x912b084acf0c18a753f6d62e25a75f5a 被编码为

    021100912b084acf0c18a753f6d62e25a75f5a
    ^^ type
      ^^ length
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ value (with top bit = 0 for non-negative)
    

    并不是

    0210912b084acf0c18a753f6d62e25a75f5a
    ^^ type
      ^^ length
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ value (with top bit = 1 for negative)
    

    即 - 2^128 + 0x912b084acf0c18a753f6d62e25a75f5a = -0x6ed4f7b530f3e758ac0929d1da58a0a6。您可以使用 查看编码openssl asn1 -dump …。

    • 12

相关问题

  • 带有 -servername 的 openssl -showcerts 给出了错误的锚点/根目录?

  • openssl 'genpkey -algorithm RSA' vs. 'genrsa'

  • 手动验证 S/MIME 消息摘要

  • 如何使用 pv 显示 openssl 加密/解密的进度?

  • 对 openssl 加密文件中的盐感到困惑

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve