#certificate #x509 #asn.1
Вопрос:
Я пытался понять, каково содержание tbsCerticate.
Вот что я сделал:
- Загрузите сертификат с веб-сайта (baidu.com) в двоичном формате der.
- Используйте
openssl x509 -in bd.cer -inform cer -text -noout >> bd.cer.noout.txt
для перевода в текст. Теперь я вижу, что в сертификате openssl asn1parse -inform der -in bd.cer > bd.cer.asn1
проанализируйте сертификат. Согласно rfc5280, вторая строка-это содержимое TBSCertificate, которое является4:d=1 hl=4 l=2326 cons: SEQUENCE
.dd if=bd.cer of=bd.cer.tbsCertificate skip=4 bs=1 count=2330
чтобы сбросить байты.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, поэтому она немного более гибкая, чем я предполагал.