BMF-RKSV-Technik / at-registrierkassen-mustercode

112 stars 39 forks source link

Die Prüfung des Belegs konnte nicht vollständig durchgeführt werden. Vermutlich konnte das Zertifikat oder der Schlüssel mit der im Beleg angegeben Seriennummer bzw. dem angegeben #679

Closed grafuzzi closed 5 years ago

grafuzzi commented 5 years ago

Guten Abend,

beim Tests der Belege (DEP Export) mittels dem Testtool (regkassen-verification-1.1.1.zip) bekomme ich immer die Fehlermeldung "verificationResultDetailedMessage" : "Die Prüfung des Belegs konnte nicht vollständig durchgeführt werden. Vermutlich konnte das Zertifikat oder der Schlüssel mit der im Beleg angegeben Seriennummer bzw. dem angegebenen Ordnungsbegriff des Unternehmens und der Schlüssel-ID nicht in der cryptographicMaterialContainer.json Datei gefunden werden. Bitte überprüfen Sie diese Datei und die darin hinterlegten Informationen. Diese Fehlermeldung ist nur im Prüftool relevant und wird in dieser Form nicht bei der Echtprüfung über FinazOnline vorkommen.",

Ich habe schon alles überprüft. bin auch schon alle Einträge in diesem Repo durchgegangen. Doch leider ist es für mich sehr schwierig die richtigen Inhalte für die Datei "cryptographicMaterialContainer.json" zu finden.

Die Inhalte habe ich einmal angefügt. Ich habe schon die Überprüfung über https://certlogik.com/decoder/ durchgeführt. Die Eingabe für base64AESKey und den HEX Code (Case Sensitiv). Das Ergebnis ist meines erachtens richtig.

Ich bitte um Hilfe - ich sehe den Wald vor lauter Bäumen nicht mehr

Anbei meine cryptographicMaterialContainer.json.txt und ein auszug aus dem DEP cryptographicMaterialContainer.json.txt datenerfassungsprotokoll.zip

Danke, grafuzzi

WienerroitherM commented 5 years ago

Hallo! Also die cryptographicMaterialContainer.json sieht korrekt aus. Allerdings ist bei den Belegen im DEP nur der payload enthalten. Header und signature fehlen. Ich vermute, dass das Prüftool dadurch keinen der DEP-Belege lesen kann und daher auch nicht die verwendete Zertifikatsseriennummer aus dem ersten Beleg mit jenem aus der cryptographicMaterialContainer.json abgleichen kann und die obenstehende Fehlermeldung ausgiebt.

grafuzzi commented 5 years ago

Hallo WienerroitherM,

danke für die schnelle Antwort. Nach deinem hinweis habe ich mir den Code nochmal angesehen. Ich glaube du hast recht und die Signatur fehlt. Der Header mit {"alg":"ES256"} sollte laut Code an das Payload angefügt sein. Oder sehe ich das falsch?

aktuell habe ich das wie folgt umgesetzt.

byte[] sigCertBytes = sigCert.Export(X509ContentType.Cert);
byte[] issCertBytes = issuerCert.Export(X509ContentType.Cert);

sigCertBase64 = Convert.ToBase64String(sigCertBytes);
issCertBase64 = Convert.ToBase64String(issCertBytes);

string jwsProtectedHeader = Base64url("{\"alg\":\"ES256\"}");
string jwsPayload = jwsBelegeKompakt = Base64url(inputToCrypt);
string toBeSignedStr = string.Format("{0}.{1}", jwsProtectedHeader, jwsPayload);

//sollte dann so aussehen
//DUMMY Code
string toBeSignedStr = string.Format("{0}.{1}.{2}", jwsProtectedHeader, jwsPayload**, sigCertBase64**);
//DUMMY Code

byte[] tbsBytes = Encoding.UTF8.GetBytes(toBeSignedStr);
byte[] signature;
ret = rkw.Sign(tbsBytes, out signature);

Das ist vermutlich auch die Lösung des Problems warum die BMF Belegscheck APP einen "Allgemeiner Fehler - Belegprüfung fehlgeschlagen. Bitte überprüfen sie den Beleg" wirft?

Danke, grafuzzi

WienerroitherM commented 5 years ago

Den Code kann ich leider nicht beurteilen, aber das Ergebnis sollte so aufgebaut sein: header.payload.signature

Also die korrekte Darstellung deines ersten Belegs im DEP wäre zB: eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMV83MjEyMDI2MjY2MzEyOF84ODk2XzIwMTktMDEtMTRUMDk6Mzg6MjVfMCwwMF8wLDAwXzAsMDBfMCwwMF8wLDAwX0E3b2c1aFZaVnhDZEZyYjhNeHk4Y2c9PV8wNTNBMEVFNV8rWk5TKzBSY2cxUT0.Signatur BASE64-URL

Hoffe das hilft!

grafuzzi commented 5 years ago

Danke das Hilft mir schon mal sehr weiter um das ganze besser zu verstehen.

Leider muss ich dazu noch eine Frage stellen - sorry - bei der Darstellung deines erstens Belegs werden die Punkte aber nicht "sichtbar" oder doch?

ich hätte es so verstanden: Header ist {\"alg\":\"ES256\"} als BASE64 Payload ist _R1-AT1_Kassenidentifikation_Belegnummer_Datum_GesamtBetrag_Betrag10%_Betrag20%_Betrag00%_BetragBesonders_Umsatzzähler_ZertifikatSeriennummerHex_signaturVorherigerBeleg als BASE64 Signatur als BASE64

das ganze Header, Payload und Signatur mit "." verketten und dann nochmal als BASE64 als JWS-Beleg-kompakt verwenden

dann sind aber keine Punkte mehr "sichtbar" im Endergebnis? oder sehe ich das falsch

WienerroitherM commented 5 years ago

Doch - die 3 bereits BASE64-URL codierten Werte werden mit dem Trennzeichen "." aneinandergereiht. Danach erfolgt keine weitere Codierung der gesamten Kette - der Beleg sieht im DEP dann wirklich so aus wie oben.

grafuzzi commented 5 years ago

vielen herzlichen dank

ich werde das heute mal so umsetzen und testen

grafuzzi commented 5 years ago

nach dem Wochende ist das ersehnte "PASS" durch das Prüftool jetzt vorhanden.

Danke nochmal für die Hilfe.

Vielleicht noch eine Frage am Rande, aus Interesse, Warum ist/muss im DEP-export.json keine Signaturzertifikat und/oder Zertifizierungsstellen angegeben werden? Ich habe bei einem Kollegen gesehen das in seinem DEP-export keine Einträge dazu vorhanden sind.

Danke, grafuzzi

Flanelli commented 5 years ago

Muss ja nicht vorhanden sein ( siehe auch RKSV-Dokumentationen ) Für das Prüftool steht alles relevante in der cryptographicMaterialContainer.json und in FON ist ebenso alles relevante ja mit der kassaanmeldung/aktivierung vorhanden

grafuzzi commented 5 years ago

Danke für die Unterstützung