【问题标题】:How can I decode tbsCertificate content?如何解码 tbsCertificate 内容?
【发布时间】:2021-09-19 20:46:17
【问题描述】:

我试图查看 tbsCerticate 的内容。

这就是我所做的:

  1. 从网站 (baidu.com) 以 der 二进制格式下载证书。
  2. 使用openssl x509 -in bd.cer -inform cer -text -noout >> bd.cer.noout.txt 翻译成文本。现在我可以看到证书中的内容
  3. openssl asn1parse -inform der -in bd.cer > bd.cer.asn1 解析证书。根据rfc5280,第二行是tbsCertificate内容,即4:d=1 hl=4 l=2326 cons: SEQUENCE
  4. dd if=bd.cer of=bd.cer.tbsCertificate skip=4 bs=1 count=2330 转储字节。
  5. openssl x509 -in bd.cer.tbsCertificate -inform der -text -noout >> bd.cer.tbs.txt现在想把bd.cer.tbsCertificate解析成x509格式看,但是失败了。
unable to load certificate
140421447947392:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:../crypto/asn1/tasn_dec.c:1149:
140421447947392:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:../crypto/asn1/tasn_dec.c:309:Type=X509_CINF
140421447947392:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:../crypto/asn1/tasn_dec.c:646:Field=cert_info, Type=X509

我想知道为什么我不能像bd.cer 一样将bd.cer.tbsCertificate 翻译成x509。我错过了什么吗?从报错看来是结构不对。

如果我想查看 txt 中的 tbsCertificate 以了解具体加密的内容,我应该怎么做。感谢您的帮助!

【问题讨论】:

    标签: certificate x509 asn.1


    【解决方案1】:

    从报错看来是结构不对。

    正确。 x509 命令只能读取证书。

    Certificate  ::=  SEQUENCE  {
        tbsCertificate       TBSCertificate,
        signatureAlgorithm   AlgorithmIdentifier,
        signatureValue       BIT STRING  }
    
    TBSCertificate  ::=  SEQUENCE  {
        version         [0]  EXPLICIT Version DEFAULT v1,
        serialNumber         CertificateSerialNumber,
        signature            AlgorithmIdentifier,
        issuer               Name,
        validity             Validity,
        subject              Name,
        subjectPublicKeyInfo SubjectPublicKeyInfo,
        issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version MUST be v2 or v3
        subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version MUST be v2 or v3
        extensions      [3]  EXPLICIT Extensions OPTIONAL
                             -- If present, version MUST be v3
        }
    

    由于您提供的是 TBSCertificate,而不是证书,因此当它期望看到 SEQUENCE, SEQUENCE 但得到 SEQUENCE, [0] 时,它出错了。

    ASN.1 DER 编码中没有任何内容说“此结构是 TBSCertificate”,该结构只是定义应写入或读取数据的顺序。因此,openssl x509 命令没有任何迹象表明您已经剥离了外部 SEQUENCE(证书结构)。 openssl asn1parse 显示数据包含的内容。 “我是一个序列,我的内容这么长。我是一个序列,我的内容这么长。我是一个特定于上下文的0,我的内容这么长,它是0x02。......”

    如果我想查看 txt 中的 tbsCertificate 以了解具体加密的内容,该怎么办。

    证书中的任何内容均未加密。

    “TBSCertificate”为“待签名证书”。外部结构是{“所有内容”、“它是如何签名的”、“签名”}。证书上的openssl x509 命令已经向您显示了 TBSCertificate 值中的内容...版本号、主题、有效性、颁发者等。

    【讨论】:

    • Nit:虽然许多 OpenSSL 命令(和相关的库例程)只能读取必须符合预期的单个数据结构,x509(以及它的 d2iPEM_read 例程)是一个例外:它可以读取 either 标准证书。这正是您引用的结构,或者一个标准证书后跟另一个单独的 ASN.1 DER SEQUENCE,其中包含一些特定于 OpenSSL 的元数据。在 PEM 中这是 BEGIN/END TRUSTED CERTIFICATE 而不是标准的 CERTIFICATE,在 C 代码中是 X509_AUX。 (否则同意。)
    • @dave_thompson_085 Nit nit:d2i_X509_AUX 可以读取普通证书和 cert+aux 连接,但 d2i_X509 只会读取标准证书(d2i_X509_AUX 调用 d2i_X509)。对于 PEM 例程也是如此(因为它们调用 d2i 函数)。但是,是的,x509 控制台命令确实使用了 AUX 版本,所以它比我暗示的要灵活一些。
    猜你喜欢
    • 2014-02-10
    • 2015-01-17
    • 1970-01-01
    • 2020-08-06
    • 2017-04-18
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多