XAdES построен на основе сертификатов X.509 и связанных с ними форматов, поэтому «инкапсулированные данные» могут содержать некие данные ASN.1 DER, закодированные в Base64. Но это не обязательно зашифровано каким-либо образом - просто толстый слой двоичных форматов.
(Действительно, MII…
префикс является контрольным признаком тега SENENCE ASN.1, скрывающегося внутри Base64.)
У меня нет описания формата XAdES под рукой, но после запуска значения тега через декодер Base64 и затем дампер ASN.1 ( тот или этот или этот ), я получаю:
$ base64 --decode <data.txt >data.raw $ dumpasn1 data.raw 0 2114: SEQUENCE { 4 9: OBJECT IDENTIFIER signedData (1 2 840 113549 1 7 2) 15 2099: [0] { 19 2095: SEQUENCE { 23 1: INTEGER 3 26 11: SET { 28 9: SEQUENCE { ...
Удобно, чтобы файл начинался со своего собственного «типа контента» (подобно типам MIME, но для X.500) и претендовал на то, чтобы быть структурой SignedData PKCS # 7 (CMS), по сути, такой же, как используется для S / MIME. OpenSSL может успешно разобрать его так:
$ openssl cms -in data.raw -inform DER -cmsout -print CMS_ContentInfo: contentType: pkcs7-signedData (1.2.840.113549.1.7.2) d.signedData: version: 3 digestAlgorithms: algorithm: sha1 (1.3.14.3.2.26) parameter: NULL encapContentInfo: eContentType: id-smime-ct-TSTInfo (1.2.840.113549.1.9.16.1.4) eContent: 0000 - 30 81 99 02 01 01 06 02-29 02 30 21 30 09 06 0.......).0!0.. 000f - 05 2b 0e 03 02 1a 05 00-04 14 d1 24 6b 80 8b .+.........$k.. 001e - ae 11 fe bb 52 d1 59 7f-8a 04 aa 40 b1 bf df ....R.Y....@... 002d - 02 04 12 82 6c b2 18 0f-32 30 31 33 30 39 33 ....l...2013093 003c - 30 31 31 33 31 32 34 5a-30 03 02 01 3c a0 51 0113124Z0...<.Q 004b - a4 4f 30 4d 31 0b 30 09-06 03 55 04 06 13 02 .O0M1.0...U.... 005a - 55 53 31 15 30 13 06 03-55 04 0a 13 0c 47 65 US1.0...U....Ge 0069 - 6f 54 72 75 73 74 20 49-6e 63 31 27 30 25 06 oTrust Inc1'0%. 0078 - 03 55 04 03 13 1e 47 65-6f 54 72 75 73 74 20 .U....GeoTrust 0087 - 54 69 6d 65 73 74 61 6d-70 69 6e 67 20 53 69 Timestamping Si 0096 - 67 6e 65 72 20 31 gner 1 certificates: d.certificate: cert_info: version: 2 ...
Здесь вы можете увидеть инкапсулированные подписанные данные, которые, опять же, имеют префикс с идентификатором типа и претендуют на то, чтобы быть «подписанной временной меткой» RFC 3161. За ним следуют сертификаты, которые использовались для подписи внешнего слоя (для краткости здесь не показаны).
Если вам нужны только сертификаты, вы можете использовать:
$ openssl pkcs7 -in data.raw -inform DER -print_certs > signer.pem
Если вам нужны подписанные данные, есть несколько способов их извлечь. Конечно, вы можете напрямую скопировать и вставить необходимые байты в новый файл. Но «правильным» методом будет полная проверка подписи и все:
$ wget -q https://www.thawte.com/roots/Thawte_Timestamping_CA.pem $ openssl cms -in data.raw -inform DER \ -verify -CAfile Thawte_Timestamping_CA.pem \ -purpose any -attime $(date -d "1 year ago" +%s) \ -out inner_data.raw -binary
Сертификат CA предназначен только для проверки, но у openssl cms
него нет возможности пропустить проверки подписи. -purpose
необходим, потому что сертификат подписи не был сертификатом S / MIME. -attime
необходимо, потому что срок действия сертификата уже истек.
Наконец, мы получаем этот блок данных с меткой времени RFC 3161 «TSTInfo» . К сожалению, он кажется некорректным, и парсер OpenSSL ASN.1 не примет его.
$ openssl ts -reply -in inner_data.raw -text :error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto/asn1/tasn_dec.c:1112: :error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:274:Type=TS_STATUS_INFO :error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:609:Field=status_info, Type=TS_RESP
Но по крайней мере его сырое содержимое может быть сброшено:
$ dumpasn1 inner_data.raw 0 153: SEQUENCE { 3 1: INTEGER 1 6 2: OBJECT IDENTIFIER. : Error: OBJECT IDENTIFIER has invalid length 2. 10 33: SEQUENCE { 12 9: SEQUENCE { 14 5: OBJECT IDENTIFIER sha1 (1 3 14 3 2 26) 21 0: NULL : } 23 20: OCTET STRING D1 24 6B 80 8B AE 11 FE BB 52 D1 59 7F 8A 04 AA 40 B1 BF DF : } 45 4: INTEGER 310537394 51 15: GeneralizedTime 30/09/2013 11:31:24 GMT 68 3: SEQUENCE { 70 1: INTEGER 60 : } 73 81: [0] { 75 79: [4] { 77 77: SEQUENCE { 79 11: SET { 81 9: SEQUENCE { 83 3: OBJECT IDENTIFIER countryName (2 5 4 6) 88 2: PrintableString 'US' : } : } 92 21: SET { 94 19: SEQUENCE { 96 3: OBJECT IDENTIFIER organizationName (2 5 4 10) 101 12: PrintableString 'GeoTrust Inc' : } : } 115 39: SET { 117 37: SEQUENCE { 119 3: OBJECT IDENTIFIER commonName (2 5 4 3) 124 30: PrintableString 'GeoTrust Timestamping Signer 1' : } : } : } : } : } : }
В качестве альтернативы:
$ openssl asn1parse -in inner_data.raw -inform DER -i