Как я могу декодировать содержимое TBSCertificate?

#certificate #x509 #asn.1

Вопрос:

Я пытался понять, каково содержание 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.tbsCertificate в x509 так же, как bd.cer . Я что-то пропустил? Из-за ошибки кажется, что структура неправильна.

Что мне делать, если я хочу увидеть TBSCertificate в txt, чтобы знать, что именно зашифровано. Спасибо вам за вашу помощь!

Ответ №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, а не сертификат, когда он ожидал увидеть ПОСЛЕДОВАТЕЛЬНОСТЬ, ПОСЛЕДОВАТЕЛЬНОСТЬ, но получил ПОСЛЕДОВАТЕЛЬНОСТЬ [0], он ошибся.

Ничто в кодировке ASN.1 DER не говорит «эта структура является TBSCertificate», структура-это просто определение порядка, в котором данные должны быть записаны или прочитаны. Таким openssl x509 образом, команда не имеет ни малейшего представления о том, что вы удалили внешнюю ПОСЛЕДОВАТЕЛЬНОСТЬ (структуру сертификата). openssl asn1parse показывает, что содержат данные. «Я-последовательность, мой контент такой длинный. Я-последовательность, мой контент такой длинный. Я контекстно-зависимый-0, мой контент такой длинный, и он равен 0x02. …»

Что мне делать, если я хочу увидеть TBSCertificate в txt, чтобы знать, что именно зашифровано.

Ничто в сертификате не зашифровано.

«TBSCertificate» — это «подлежащий подписанию сертификат». Внешняя структура { «все содержимое», «как оно было подписано», «подпись» }. openssl x509 Команда в сертификате уже показала вам, что было в значении TBSCertificate… номер версии, тема, срок действия, эмитент и т.д.

Комментарии:

1. Nit: в то время как многие команды OpenSSL (и связанные с ними библиотечные процедуры) могут считывать только одну структуру данных, которая должна быть такой, как ожидается x509 ( d2i и PEM_read процедуры для нее), является исключением: она может считывать либо стандартный сертификат,. это именно та структура, которую вы цитируете, ИЛИ стандартный сертификат, за которым следует другая, отдельная ПОСЛЕДОВАТЕЛЬНОСТЬ ASN.1, содержащая некоторые метаданные, относящиеся к OpenSSL. В PEM это BEGIN/END TRUSTED CERTIFICATE вместо стандартного CERTIFICATE , и в коде C это тип X509_AUX . (В остальном согласен.)

2. @dave_thompson_085 Nit nit: d2i_X509_AUX может считывать как простой сертификат, так и конкатенацию cert aux, но d2i_X509 будет считывать только стандартный сертификат (d2i_X509_AUX вызывает d2i_X509). Аналогично для подпрограмм PEM (потому что они вызывают функции d2i). Но да, консольная команда x509 использует версии AUX, поэтому она немного более гибкая, чем я предполагал.