Marcel Logen
2020-10-17 17:48:43 UTC
Hat hier schon mal jemand erfolgreich die Signatur einer Telekom-
Rechnung mit "openssl" (aus LibreSSL oder OpenSSL) verifiziert?
Ich plage mich schon seit Tagen damit herum.
Es gibt eine Rechnungs-Datei (.pdf) und eine "Signatur"-Datei (.pkcs7).
Die PKCS7-Datei ist im Binärformat.
Der erste Versuch war ganz naiv folgender:
| t20$ openssl cms -verify -inform der -in 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pkcs7 -content 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pdf -CAfile eidas-und-root.pem
| Verification failure
| 16843108543232:error:0DFFF09B:asn1 encoding routines:CRYPTO_internal:too long:/usr/src/lib/libcrypto/asn1/asn1_lib.c:143:
| 16843108543232:error:0DFFF066:asn1 encoding routines:CRYPTO_internal:bad object header:/usr/src/lib/libcrypto/asn1/tasn_dec.c:1135:
| 16843108543232:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/usr/src/lib/libcrypto/asn1/tasn_dec.c:317:Type=ECDSA_SIG
| 16843108543232:error:2EFFF09E:CMS routines:CRYPTO_internal:verification failure:/usr/src/lib/libcrypto/cms/cms_sd.c:818:
| t20$
Dann habe ich gegoogelt und das hier gefunden:
<https://stackoverflow.com/questions/59904522/asn1-encoding-routines-errors-when-verifying-ecdsa-signature-type-with-openssl>.
Das ist schon mal recht aufschlußreich.
Jetzt stellt sich die Frage, wo in der PKCS7-Datei sich die
eigentliche Signatur befindet. Dazu habe ich "openssl asn1parse"
bemüht.
Es kommen zwei Stellen in Frage, wobei die erste ausscheidet,
da es sich dabei wohl um die Signatur im Zertifikat handelt.
Also bleiben die Daten ganz am Ende der PKCS7-Datei (64 Bytes):
| t20$ hexdump -Cv 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pkcs7 | tail -n 6
| 00000980 01 01 04 01 03 05 00 04 40 46 52 99 86 4a f4 bb |***@FR..J..|
^^ ab hier
| 00000990 f4 30 e1 39 b6 fd 97 e1 1f 15 45 ab fb fe 08 c2 |.0.9......E.....|
| 000009a0 b4 4b df fe e7 f7 28 aa 0b 98 da c5 eb 2e 20 74 |.K....(....... t|
| 000009b0 5d 41 fb a3 cf de fa 94 48 8f a7 4f cf 8f a5 84 |]A......H..O....|
| 000009c0 28 b9 63 c3 9a 90 92 84 90 |(.c......|
| 000009c9
Diese Daten habe ich dann gemäß der stackoverflow-Anleitung
so aufbereitet:
| t20$ hexdump -Cv signature7ende.bin
| 00000000 30 45 02 20 46 52 99 86 4a f4 bb f4 30 e1 39 b6 |0E. FR..J...0.9.|
^^ ^^ ^^ ^^
| 00000010 fd 97 e1 1f 15 45 ab fb fe 08 c2 b4 4b df fe e7 |.....E......K...|
| 00000020 f7 28 aa 0b 02 21 00 98 da c5 eb 2e 20 74 5d 41 |.(...!...... t]A|
^^ ^^ ^^
| 00000030 fb a3 cf de fa 94 48 8f a7 4f cf 8f a5 84 28 b9 |......H..O....(.|
| 00000040 63 c3 9a 90 92 84 90 |c......|
| 00000047
Die unterhakelten Bytes habe ich also hinzugefügt.
Das ergibt offenbar eine *formal* richtig aufbereitete
Signatur (für "Public Key Algorithm: id-ecPublicKey (256 Bit)"
mit "ASN1 OID: brainpoolP256r1" und "ecdsa-with-SHA256" (laut der
PKCS7-Datei und dem darin enthaltenen Zertifikat)):
| t20$ openssl asn1parse -in signature7ende.bin -inform der
| 0:d=0 hl=2 l= 69 cons: SEQUENCE
| 2:d=1 hl=2 l= 32 prim: INTEGER :465299864AF4BBF430E139B6FD97E11F1545ABFBFE08C2B44BDFFEE7F728AA0B
| 36:d=1 hl=2 l= 33 prim: INTEGER :98DAC5EB2E20745D41FBA3CFDEFA94488FA74FCF8FA58428B963C39A90928490
| t20$
So, jetzt kommt die Prüfung:
| t20$ openssl dgst -sha256 -verify pubk-aus-cert.pem -signature signature7ende.bin 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pdf
| Verification Failure
| t20$
Tja.
BTW: Der SHA256-Hash der PDF-Datei stimmt wohl - er taucht auch in
der PKCS7-Datei auf.
Keine Ahnung, was ich hier fslach mache ...
Vielleicht hat hier ja jemand eine Idee. TIA :-)
Marcel
Rechnung mit "openssl" (aus LibreSSL oder OpenSSL) verifiziert?
Ich plage mich schon seit Tagen damit herum.
Es gibt eine Rechnungs-Datei (.pdf) und eine "Signatur"-Datei (.pkcs7).
Die PKCS7-Datei ist im Binärformat.
Der erste Versuch war ganz naiv folgender:
| t20$ openssl cms -verify -inform der -in 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pkcs7 -content 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pdf -CAfile eidas-und-root.pem
| Verification failure
| 16843108543232:error:0DFFF09B:asn1 encoding routines:CRYPTO_internal:too long:/usr/src/lib/libcrypto/asn1/asn1_lib.c:143:
| 16843108543232:error:0DFFF066:asn1 encoding routines:CRYPTO_internal:bad object header:/usr/src/lib/libcrypto/asn1/tasn_dec.c:1135:
| 16843108543232:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/usr/src/lib/libcrypto/asn1/tasn_dec.c:317:Type=ECDSA_SIG
| 16843108543232:error:2EFFF09E:CMS routines:CRYPTO_internal:verification failure:/usr/src/lib/libcrypto/cms/cms_sd.c:818:
| t20$
Dann habe ich gegoogelt und das hier gefunden:
<https://stackoverflow.com/questions/59904522/asn1-encoding-routines-errors-when-verifying-ecdsa-signature-type-with-openssl>.
Das ist schon mal recht aufschlußreich.
Jetzt stellt sich die Frage, wo in der PKCS7-Datei sich die
eigentliche Signatur befindet. Dazu habe ich "openssl asn1parse"
bemüht.
Es kommen zwei Stellen in Frage, wobei die erste ausscheidet,
da es sich dabei wohl um die Signatur im Zertifikat handelt.
Also bleiben die Daten ganz am Ende der PKCS7-Datei (64 Bytes):
| t20$ hexdump -Cv 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pkcs7 | tail -n 6
| 00000980 01 01 04 01 03 05 00 04 40 46 52 99 86 4a f4 bb |***@FR..J..|
^^ ab hier
| 00000990 f4 30 e1 39 b6 fd 97 e1 1f 15 45 ab fb fe 08 c2 |.0.9......E.....|
| 000009a0 b4 4b df fe e7 f7 28 aa 0b 98 da c5 eb 2e 20 74 |.K....(....... t|
| 000009b0 5d 41 fb a3 cf de fa 94 48 8f a7 4f cf 8f a5 84 |]A......H..O....|
| 000009c0 28 b9 63 c3 9a 90 92 84 90 |(.c......|
| 000009c9
Diese Daten habe ich dann gemäß der stackoverflow-Anleitung
so aufbereitet:
| t20$ hexdump -Cv signature7ende.bin
| 00000000 30 45 02 20 46 52 99 86 4a f4 bb f4 30 e1 39 b6 |0E. FR..J...0.9.|
^^ ^^ ^^ ^^
| 00000010 fd 97 e1 1f 15 45 ab fb fe 08 c2 b4 4b df fe e7 |.....E......K...|
| 00000020 f7 28 aa 0b 02 21 00 98 da c5 eb 2e 20 74 5d 41 |.(...!...... t]A|
^^ ^^ ^^
| 00000030 fb a3 cf de fa 94 48 8f a7 4f cf 8f a5 84 28 b9 |......H..O....(.|
| 00000040 63 c3 9a 90 92 84 90 |c......|
| 00000047
Die unterhakelten Bytes habe ich also hinzugefügt.
Das ergibt offenbar eine *formal* richtig aufbereitete
Signatur (für "Public Key Algorithm: id-ecPublicKey (256 Bit)"
mit "ASN1 OID: brainpoolP256r1" und "ecdsa-with-SHA256" (laut der
PKCS7-Datei und dem darin enthaltenen Zertifikat)):
| t20$ openssl asn1parse -in signature7ende.bin -inform der
| 0:d=0 hl=2 l= 69 cons: SEQUENCE
| 2:d=1 hl=2 l= 32 prim: INTEGER :465299864AF4BBF430E139B6FD97E11F1545ABFBFE08C2B44BDFFEE7F728AA0B
| 36:d=1 hl=2 l= 33 prim: INTEGER :98DAC5EB2E20745D41FBA3CFDEFA94488FA74FCF8FA58428B963C39A90928490
| t20$
So, jetzt kommt die Prüfung:
| t20$ openssl dgst -sha256 -verify pubk-aus-cert.pem -signature signature7ende.bin 2020_10_rechnung_5XXXXXXXX7_sign_20201012.pdf
| Verification Failure
| t20$
Tja.
BTW: Der SHA256-Hash der PDF-Datei stimmt wohl - er taucht auch in
der PKCS7-Datei auf.
Keine Ahnung, was ich hier fslach mache ...
Vielleicht hat hier ja jemand eine Idee. TIA :-)
Marcel
--
╭─╮ ╭─────────╮ ╭─────────╮ ╭─╮ ╭─────╮
╭──╯ │ ╰────╮ ╭─╯ ╰───╮ ╰─╯ ╰─╮ ╭──╮ ╭────╯ ╭──╯
╯ │ ╭─╮ ╭───╯ ╰─╮ ╭─╮ ╰────╮ ╭───╯ │ │ ╰─╮ ╭──╯ ╭──╮
╰───────╯ ╰──╯ ╰─╯ ╰───────╯ ╰──────╯ ╰────╯ ╰──────╯ ╰─
╭─╮ ╭─────────╮ ╭─────────╮ ╭─╮ ╭─────╮
╭──╯ │ ╰────╮ ╭─╯ ╰───╮ ╰─╯ ╰─╮ ╭──╮ ╭────╯ ╭──╯
╯ │ ╭─╮ ╭───╯ ╰─╮ ╭─╮ ╰────╮ ╭───╯ │ │ ╰─╮ ╭──╯ ╭──╮
╰───────╯ ╰──╯ ╰─╯ ╰───────╯ ╰──────╯ ╰────╯ ╰──────╯ ╰─