Wie entschlüsselt man einen gekapselten Zeitstempel?

771
meles

Ich habe eine Datei namens signatures.xml, die Teil einer Adobe AIR-Datei ist. Nun möchte ich die im XADES Encapsulated Time Stamp gespeicherten Informationen entschlüsseln. Wie kann ich Informationen aus der verschlüsselten Zeichenfolge abrufen? Welche Tools sollen verwendet werden? Und brauche ich den öffentlichen Schlüssel, um ihn zu entschlüsseln, und woher bekomme ich ihn? (Als Hinweis denke ich, dass dieses Zertifikat verwendet wurde: https://blogs.oracle.com/mullan/java-applications-sind-signiert-und-zeitgestempelt-mit-geotrust-timestamp-authority-are- funktioniert nicht mehr ) Und das ist der Code:

 <xades:QualifyingProperties> <xades:UnsignedProperties >  <xades:UnsignedSignatureProperties> <xades:SignatureTimeStamp> <xades:HashDataInfo uri="#PackageSignatureValue"> <Transforms> <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> </Transforms> <xades:EncapsulatedTimeStamp>  MIIIQgYJKoZIhvcNAQcCoIIIMzCCCC8CAQMxCzAJBgUrDgMCGgUAMIGvBgsqhkiG9w0BCRABBKCB nwSBnDCBmQIBAQYCKQIwITAJBgUrDgMCGgUABBTRJGuAi64R/rtS0Vl/igSqQLG/3wIEEoJsshgP MjAxMzA5MzAxMTMxMjRaMAMCATygUaRPME0xCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxHZW9UcnVz dCBJbmMxJzAlBgNVBAMTHkdlb1RydXN0IFRpbWVzdGFtcGluZyBTaWduZXIgMaCCBY8wggLmMIIC T6ADAgECAhBejS2spEZlVGu1h5eBkai/MA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJaQTEV MBMGA1UECBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52aWxsZTEPMA0GA1UEChMGVGhh d3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0GA1UEAxMWVGhhd3RlIFRpbWVz dGFtcGluZyBDQTAeFw0wNzEwMzEwMDAwMDBaFw0xNzEwMzAyMzU5NTlaME0xCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxHZW9UcnVzdCBJbmMxJzAlBgNVBAMTHkdlb1RydXN0IFRpbWVzdGFtcGluZyBT aWduZXIgMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr2cSRUIuWwkzzCmZ7JAkmml3LgpP UWIwZGkule4Cdqm1sYykLX1Fw/kF5lbYnjQZGStQPfUnfa+RbQKnGNk+0SSYJWcApzfUouoWolC9 9TgXjwJJcZIfQnk8cmoKleXF+TkEQgiBTxKhDUa4KhayhbDvWh903qhKp0e6jo5T/pkCAwEAAaOB hzCBhDAMBgNVHRMBAf8EAjAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly90c3MtZ2VvdHJ1c3Qt Y3JsLnRoYXd0ZS5jb20vVGhhd3RlVGltZXN0YW1waW5nQ0EuY3JsMA4GA1UdDwEB/wQEAwIGwDAW BgNVHSUBAf8EDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQUFAAOBgQCp8h1xrhHJJ0mPaN/n3gzf qZ5J/SIs9aQD/tZsI6zzsvyS9uxqwrhS2IzRyvrrxQyYgdn2zlwzTn7W1I+yvJ2Bc+rwbOOpwW7X 9tlGoAdDnNn3YGHDL27aUD4WoCgM7OQBoeRsmdXCMah96y0TAilp2R6WF0D72u9i14QHsYL5kTCC AqEwggIKoAMCAQICAQAwDQYJKoZIhvcNAQEEBQAwgYsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxX ZXN0ZXJuIENhcGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQKEwZUaGF3dGUxHTAbBgNV BAsTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1waW5nIENB MB4XDTk3MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgYsxCzAJBgNVBAYTAlpBMRUwEwYDVQQI EwxXZXN0ZXJuIENhcGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQKEwZUaGF3dGUxHTAb BgNVBAsTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1waW5n IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWK1h4YUWGU+o0e1Gc7bDmLhgO/uBfqCfT tMngfFlOFg5zVGDBf/afLuk6hSQVPNtHBGPDnsSUGlrfTHrz2UMdPBB6eSXbkP7wUecw1kEA/Z8o 33m+lLudthTjI4XXqUHgTKR5sCsai/L4O4o+RaxxkgC0kEGY+1/t+rcuiviINwIDAQABoxMwETAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAGfb4sLmhz1Ag4Y3NX0fzprDDGYgqLqq BImGwvUQCA2/y6IFitBNNj701+9pxl7ksJRvSrnn3luItnvb4yfldsPwNcHLtSebM3nckKYAnnf6 /M0nlEIWnNMcaOy/XN3lqXsQCjJ0VBMxi4UDhJG3WAEwFDivKMr8sVAZGQmsiUnTMYIB1jCCAdIC AQEwgaAwgYsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxFDASBgNVBAcTC0R1 cmJhbnZpbGxlMQ8wDQYDVQQKEwZUaGF3dGUxHTAbBgNVBAsTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9u MR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1waW5nIENBAhBejS2spEZlVGu1h5eBkai/MAkGBSsO AwIaBQCggYwwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0xMzA5 MzAxMTMxMjRaMCMGCSqGSIb3DQEJBDEWBBT3Vzs/HYAkfx+RMIi3fWS/+YzGWTArBgsqhkiG9w0B CRACDDEcMBowGDAWBBQiPNonB5ZzgWtgihuMsKsCMBB/zDANBgkqhkiG9w0BAQEFAASBgJZOFu5t PDnUenO2A1BZ788Yh/sRI/hjC//zAXRY9rnq/t7hvFGDbruA0pEsTlynJpaKeIu4J/M1iday+phr BKcj7o0pFYKquDMC/RKnkG+P5tc9QBrvPaAwamrdjoYmXtC6hiRnkA/X0gG/68PtBjGJQpmPmcWt CpdLjrFCsjen </xades:EncapsulatedTimeStamp>  </xades:HashDataInfo>  </xades:SignatureTimeStamp> </xades:UnsignedSignatureProperties>  </xades:UnsignedProperties> </xades:QualifyingProperties> </Object> 
0
Die Informationen scheinen base64-codiert zu sein, nur das Ergebnis ist immer noch etwas unordentlich, wenn ich sie decodiere. meles vor 6 Jahren 0

1 Antwort auf die Frage

1
grawity

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 cmskeine Option zum Überspringen der Signaturprüfungen. -purposeist erforderlich, da das Signaturzertifikat kein S / MIME-Zertifikat war. -attimewird 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 
perfekte Lösung! meles vor 6 Jahren 0