У меня есть файл с именем 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>

1 ответ1

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .