BMF-RKSV-Technik / at-registrierkassen-mustercode

111 stars 39 forks source link

A-Trust HSM Webservice / Die kryptographische Gültigkeit der Signatur ist nicht gegeben #723

Closed syphobia closed 1 year ago

syphobia commented 1 year ago

Liebe User,

ich habe schon fast alles versucht, doch ich finde den Fehler nicht. Ich signiere mit A-Trust Webservice, hab JWS, Plain und Hash probiert, aktuell bin ich bei Hash geblieben, da ich hier die meiste Kontrolle habe. Bekomme immer den bekannten Fehler "Die kryptographische Gültigkeit der Signatur ist nicht gegeben" mit dem Prüftool.

Die Daten sind aus dem A-Trust Test System und der AES Schlüssel wird auch nicht Produktiv verwendet, deshalb hab ich sie hier gepostet. Ist das Test-System das Problem?

Ich habe bei den Issues schon geschaut, auch das tolle Dokument "Checkliste für die Signaturerstellung", bin Schritt für Schritt nochmal über alles drüber, doch komm einfach nicht drauf. Der fast identische Code klappt einwandfrei mit einem USB Zertifikat, doch über das Webservice klappt es einfach nicht.

Hier ein Auszug aus dem Source Code plus Kommentare von den Werten aus dem Debugger

String machineCodeRepOfReceipt = "_R1-AT1_kassa1001_beleg0001_2023-07-20T11:23:57_0,00_0,00_0,00_0,00_0,00_gRNXL8naEvI=_3f07b25d_w3CXHePl2aI=";

String jwsHeaderBase64Url = CashBoxUtils.base64Encode("{\"alg\":\"ES256\"}".getBytes(StandardCharsets.UTF_8),true).replaceAll("=",""); //eyJhbGciOiJFUzI1NiJ9
String jwsPayloadBase64Url = CashBoxUtils.base64Encode(machineCodeRepOfReceipt.getBytes(StandardCharsets.UTF_8),true).replaceAll("=",""); //X1IxLUFUMV9rYXNzYTEwMDFfYmVsZWcwMDAxXzIwMjMtMDctMjBUMTE6MjM6NTdfMCwwMF8wLDAwXzAsMDBfMCwwMF8wLDAwX2dSTlhMOG5hRXZJPV8zZjA3YjI1ZF93M0NYSGVQbDJhST0
String jwsDataToBeSigned = jwsHeaderBase64Url + "." + jwsPayloadBase64Url; //eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMV9rYXNzYTEwMDFfYmVsZWcwMDAxXzIwMjMtMDctMjBUMTE6MjM6NTdfMCwwMF8wLDAwXzAsMDBfMCwwMF8wLDAwX2dSTlhMOG5hRXZJPV8zZjA3YjI1ZF93M0NYSGVQbDJhST0

byte[] hashBytes = HashUtil.sha256Bytes(jwsDataToBeSigned); //32 bytes
String hashBytesBase64 = CashBoxUtils.base64Encode(hashBytes,false); //GHzRfZTcCskfJfgusfOgbb95YUGkVZ0H6x9LCxxs7ng=

//Hier wirt von A-Trust HSM /Sign/Hash verwendet
String signatureBase64 = signer.signHash(hashBytesBase64); //IASKh7M-KjLG3YAhjYCAb2px9S3hiyGgoGP9QpWKhZvUGjPqCsVBcWY8c1ZmLVbQjA7whIvvRvpCwiLVnkOfyw

byte[] signatureBytes = CashBoxUtils.base64Decode(signatureBase64,false); //64 bytes
String signatureBase64Url = CashBoxUtils.base64Encode(signatureBytes,true); //IASKh7M-KjLG3YAhjYCAb2px9S3hiyGgoGP9QpWKhZvUGjPqCsVBcWY8c1ZmLVbQjA7whIvvRvpCwiLVnkOfyw

String jwsCompact = jwsDataToBeSigned + "." + signatureBase64Url; //eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMV9rYXNzYTEwMDFfYmVsZWcwMDAxXzIwMjMtMDctMjBUMTE6MjM6NTdfMCwwMF8wLDAwXzAsMDBfMCwwMF8wLDAwX2dSTlhMOG5hRXZJPV8zZjA3YjI1ZF93M0NYSGVQbDJhST0.IASKh7M-KjLG3YAhjYCAb2px9S3hiyGgoGP9QpWKhZvUGjPqCsVBcWY8c1ZmLVbQjA7whIvvRvpCwiLVnkOfyw

Wäre super dankbar wenn mir jemand einen Denkanstoß geben könnte was ich übersehen hab! Vielen Dank im Voraus

Im Anhang sind die Files für das Prüftool

cryptographicMaterialContainer.txt dep-export.txt

ErichFreitag commented 1 year ago

Ich kann dazu (nur) die beiliegenden Dokumente bereitstellen. RKSV_SigCheck_en.pdf PQRST_RKSV_Datenmodell_Signaturerstellung.pdf

syphobia commented 1 year ago

Vielen Dank, aber die 2 Dokumente hatte ich eh schon etliche male durch. Hatte jetzt die Idee es mit dem Produktiv/Live System von A-Trust zu probieren und siehe da, der Code ist völlig richtig und alles PASSED.

Also für alle die dieses Topic hier finden: Es scheint als hätten die Zertifikate des A-Trust Test-Systems ein "Problem" - mit dem Live System funktioniert alles einwandfrei.

Falls A-Trust dieses Topic verfolgt: Ein Hinweis in den Dokumentationen hätte viel Arbeit erspart :)

Danke!