XAdES basiert auf X.509-Zertifikaten und zugehörigen Formaten. Daher enthalten die "gekapselten Daten" wahrscheinlich eine Art ASN.1-DER-Daten, die in Base64 codiert ist. Es ist jedoch nicht unbedingt in irgendeiner Weise verschlüsselt - nur eine dicke Schichtung von Binärformaten.
(Tatsächlich ist das MII…
Präfix ein verräterisches Zeichen für einen ASN.1 SEQUENCE-Tag, der sich in Base64 versteckt.)
Ich habe die XAdES-Formatbeschreibung nicht zur Hand, aber nachdem ich den Tag-Wert durch einen Base64-Decoder und dann einen ASN.1-Dumper ( dieses oder das oder das ) laufen ließ, bekomme ich:
$ 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 { ...
Praktischerweise beginnt die Datei mit einem eigenen "Inhaltstyp" (wie MIME-Typen, jedoch für X.500) und behauptet, eine PKCS # 7 (CMS) SignedData- Struktur zu sein, im Wesentlichen dieselbe wie für S / MIME. OpenSSL kann es erfolgreich als solches analysieren:
$ 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 ...
Hier können Sie die gekapselten signierten Daten sehen - denen wiederum ein Typenbezeichner vorangestellt wird, der behauptet, ein "signierter Zeitstempel" des RFC 3161 zu sein. Es folgen die Zertifikate, die zum Signieren der äußeren Schicht verwendet wurden (hier der Kürze halber nicht dargestellt).
Wenn Sie nur die Zertifikate benötigen, können Sie Folgendes verwenden:
$ openssl pkcs7 -in data.raw -inform DER -print_certs > signer.pem
Wenn Sie die signierten Daten benötigen, gibt es verschiedene Möglichkeiten, sie zu extrahieren. Natürlich können Sie die benötigten Bytes direkt in eine neue Datei kopieren und einfügen. Die "richtige" Methode wäre jedoch die vollständige Signaturüberprüfung und alles:
$ 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
Das CA-Zertifikat dient nur zur Überprüfung, hat jedoch openssl cms
keine Option zum Überspringen der Signaturprüfungen. -purpose
ist erforderlich, da das Signaturzertifikat kein S / MIME-Zertifikat war. -attime
wird benötigt, da das Zertifikat bereits abgelaufen ist.
Schließlich erhalten wir diesen RFC 3161 "TSTInfo" -Zeitzeichen- Blob. Leider scheint es fehlerhaft zu sein, und der ASN.1-Parser von OpenSSL akzeptiert dies nicht.
$ 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
Aber zumindest der Rohinhalt kann abgeladen werden:
$ 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' : } : } : } : } : } : }
Alternative:
$ openssl asn1parse -in inner_data.raw -inform DER -i