Как расшифровать инкапсулированный штамп времени?

727
meles

У меня есть файл с именем signatures.xml, который является частью файла Adobe AIR. Теперь я хотел бы расшифровать информацию, хранящуюся в XADES Encapsulated Time Stamp. Как я могу получить любую информацию из зашифрованной строки? Какие инструменты должны быть использованы? И нужен ли мне открытый ключ для его расшифровки и где его взять? (Как подсказка, я думаю, что этот сертификат использовался: https://blogs.oracle.com/mullan/java-applications-that-are-signed-and-timestamped-with-the-geotrust-timestamp-authority-are- больше не работает ) И вот код:

 <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
Информация кажется закодированной в base64, просто результат все еще немного грязный, когда я ее декодирую. meles 6 лет назад 0

1 ответ на вопрос

1
grawity

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 
идеальное решение! meles 6 лет назад 0

Похожие вопросы