BMF-RKSV-Technik / at-registrierkassen-mustercode

111 stars 39 forks source link

Die kryptographische Gültigkeit der Signatur ist nicht gegeben. #626

Closed To0m closed 6 years ago

To0m commented 7 years ago

Hallo zusammen,

ich hoffe mir kann jemand helfen. Leider haben wir ebenfalls das Problem, dass die kryptographische Gültigkeit der Signatur nicht gegeben sei. Wir nutzen, um die Daten zu signieren, einen Cardreader mit einer Karte von PrimeSign.

Die zu signierenden Daten werden per Bluetooth sha256 verschlüsselt an den Cardreader übergeben. Das Ergebnis wandeln wir dann in Base64 um.

Zugriff zum FON haben wir leider nicht, da wir ein Unternehmen aus Deutschland sind und somit bisher leider keine Registrierung bekommen haben.

Zurück zum Problem. Folgende Daten sind von einem Startbeleg, der dazugehörige DEP-Export und der cryptographicMaterialContainer:

QR-Code: qr-code-rep.txt

_R1-AT3_POS-BASE-5_0005-1_2017-08-28T15:23:00_0,00_0,00_0,00_0,00_0,00_dHsm8Vr57zg=_e2c01503913c_ItxTUMsEILU=_xop83ipkfrJGXxGQvubBmAJf2HbPTZV8L8GX3v1+k2b7PFxZNrAgE9xEpnJNACUvzRKpOTB1Yq79hOtSpRaH6Q==

cryptographicMaterialContainer: cryptographicMaterialContainer.txt

{ "base64AESKey" : "SHV5O11oMmVvXGdIa2g9T1RtSjlJb2V5OkthbDI2U2E=", "certificateOrPublicKeyMap" : { "e2c01503913c" : { "id" : "e2c01503913c", "signatureDeviceType" : "CERTIFICATE", "signatureCertificateOrPublicKey" : "MIIEizCCAnOgAwIBAgIHAOLAFQORPDANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJBVDEXMBUGA1UEChMOUHJpbWVTaWduIEdtYkgxKTAnBgNVBAMMIENSWVBUQVMtUHJpbWVTaWduICFURVNUISBSS1NWIENBMB4XDTE3MDQwNTExMTAyMFoXDTIzMDQwNTExMTAyMFowPzELMAkGA1UEBhMCQVQxFjAUBgNVBAoTDUZhb25saW5lIFRlc3QxGDAWBgNVBAMTD1VJRCBBVFU1Nzc4MDgxNDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJN2qecPpkhIkovjQoeTBeldO0AYT4aws1sz5br4L0aPd6JelsJhQnFw3mxM2gAdbf8igXWy2+LDy9fgRdFhCqOjggFDMIIBPzAOBgNVHQ8BAf8EBAMCBsAwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vdGMucHJpbWUtc2lnbi5jb20vY2VydHMvcmtzdi10ZXN0LWNhLmNlcjAfBgNVHSMEGDAWgBQO1dzoosjEeVwMUkD8o/fOOqPe0zBBBgNVHSAEOjA4MDYGByooACcBAAIwKzApBggrBgEFBQcCARYdaHR0cDovL3RjLnByaW1lLXNpZ24uY29tL2Nwcy8wHAYHKigACgELAQQRDA9VSUQgQVRVNTc3ODA4MTQwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL3RjLnByaW1lLXNpZ24uY29tL2NybHMvcmtzdi10ZXN0LWNhLmNybDAdBgNVHQ4EFgQUJ0sF1y/QM/0QldNDcan3L1juQsswDQYJKoZIhvcNAQELBQADggIBABGmEFXvFOzhRgrq/BJi05n2nScPn7BpQa0CH7AOG3jPc9fenQVO5NOBYh2xAtL5Ceka7P+Pyomh4cpualT0/MKCR4p+Ax9r2fmlKVsmeDSr1SRDPSb5K+v4gbi+7JNrse3kN4ZlWlnUoAdgcB6I2uMxhuTRy3Kb2KjG1hgYUIQVXCKlZwr3iLOUvFL7tLLcKHV5Gzss87xpnCZHJHPcfZFbOvs4z0XJnIhpwMbeQspEZlQ37oxSHkqHBcFibhfM2jeY9WAYslxkmKy59pNEFTHyuszX63C5CdEohiRCW6oFoKjtwZRvynoV6H0y08iml2F4n5XfA5MjMsuMljBe2eQkQ9L5NcQR7sUZ/Za9YBkcGuzTgl+1JyIJ5dSBW13VK3rHLa7ZRHh4e+4dVOqaCTFTFtdnV2gDhcP3YmM3POFcEU5xdZyRA2/3W8j5EpHb7qAl13sx6hWYQV9V1BSdLbK49nEtSgRYdseG/15FgIfYCIyO5KNvPNJDHdKLpH0Vg77esmRrdCNA8+d93a1+cy52T4BIUch9mHwtd3QVDNHU1BGNfMiwsjlN0yRPNUewesc6dFKOAcbuQfqOgvQTjCa1jqH/LLc5HbgrF7VFUEUeNq9W1MFS9KJ2scFzZ6QLzFD+j9m/g0xpWBupXVhsd++NGybnDKznmFFYGDNffF5q" } }

DEP-Export: depExport.txt

{ "Belege-Gruppe": [ { "Signaturzertifikat": "", "Zertifizierungsstellen": [], "Belege-kompakt": [ "eyJhbGciOiJFUzI1NiJ9.X1IxLUFUM19QT1MtQkFTRS01XzAwMDUtMV8yMDE3LTA4LTI4VDE1OjIzOjAwXzAsMDBfMCwwMF8wLDAwXzAsMDBfMCwwMF9kSHNtOFZyNTd6Zz1fZTJjMDE1MDM5MTNjX0l0eFRVTXNFSUxVPQ.NzFmZTFlOTRmYmUwY2Y3NTkwMGExZjhkYmFkNDI2MTk1ZjM5NWFjNDk0YTM1NGJmM2NhMzRhMzZlNmM4NWFmMQ" ]}]}

Ich finde leider nicht den Fehler. Der verschlüsselte Barumsatz des Beleges entspricht 0€ und der Verkettungswert wurde korrekt mit Hilfe der Kassen-ID erstellt (Beides gegengeprüft). Das Zertifikat habe ich auch schon auf https://certlogik.com/decoder/ gecheckt, das ist auch nicht das Problem.

Die adneren Issues und die Checkliste https://github.com/a-sit-plus/at-registrierkassen-mustercode/blob/master/Dokumente/2016-12-12%20SIG-Check.pdf haben schon sehr geholfen. Aber leider sagt das Prüftool immer noch, dass die kryptographische Gültigkeit der Signatur fehlerhaft ist.

0000_cashbox_full.txt 0000_cashbox.txt 0000_app.txt

Ich hoffe Ihr könnt mir helfen, ich verzweifel langsam

Mit besten Grüßen Tom

PS: Falls ihr noch irgendwelche Infos benötigt, lasst es mich wissen!

ErichFreitag commented 7 years ago

In solchen Fällen können sie leider nur systematisch und Schritt für Schritt vorgehen. Vor allem auch darauf achten, was in ihrer Konstellation und bei ihrer Software-Schnittstelle speziell oder anders sein könnte. Die Signatur hat auch nichts mit FON oder den Inhalten (Umsatzzähler, ...) zu tun - die Signatur erfolgt über die zu signierenden Daten und da ist es für die Gültigkeit zunächst egal, was der Inhalt ist.

Rein formal sehe ich keine Fehler (z.B. in der Signaturlänge). Was auffällt - was machen sie da mit "über bloetooth verschlüsselt übergeben"? Das sagt mir so nichts. Können sie beispielsweise die Karte zumindest testweise direkt an ihren Rechner anbinden? Wenn nicht versuchen sie es mit einem anderen Zertifikat und z.B. einem USB-Kartenleser. Versuchen sie alles, was nicht rein zur Signaturerstellung gehört wegzulassen, um mögliche Fehlerquellen auszuschalten.

To0m commented 7 years ago

Hallo, vielen Dank für Ihre Antwort. Wir entwicklen ein Kassensystem für mobile Geräte, daher ist der Cardreader per Bluetooth mit dem mobilen Gerät verbunden.

Könnte es evtl. daran liegen, dass wir eine Testkarte mit einem Test-Zertifikat haben und es somit kein "echtes" Zertifikat ist?

ErichFreitag commented 7 years ago

Gerne. ad Bluetooth) OK, danke. Mich hat nur stutzig gemacht, dass sie da etwas (zusätzlich?) verschlüsseln. Zumindest testweise sollten sie alles "unnötige" und möglicherweise fehlerbringende ausschalten oder entfernen

ad Zertifikat) kann sein. Es geht weniger darum, ob sie ein echtes oder ein nicht-echtes Zertifikat verwenden, sondern ob es ein richtiges Zertifikat ist und ob sie das richtige Zertifikat verwenden. Ansonsten ist Signatur gleich Signatur, egal ob echt oder nicht. Nachdem sie geschrieben haben dass sie 1) schon alle Issues dazu durchgesehen haben (also auch bezüglich Verwendung des "richtigen" Zertifikats) und 2) das Zertifikat schon decodiert überprüft haben habe ich das nicht weiter geprüft.

RipperFox commented 7 years ago

Ich habe leider das selbe Problem. Verwendet wird der a-Trust DLL Wrapper. Selbst mit dem Democode von a-Trust bekomme ich keine vom Prüftool akzeptierte Signatur hin. Relevanter Codeteil aus dem Democode (ich habe den Eingabestring auf meinen Startbeleg geändert) : ` string JWS_Protected_Header = Base64url("{\"alg\":\"ES256\"}");

        // Startbeleg aus der Anwendung:
        string JWS_Payload = Base64url("_R1-AT1_CASHBOX-DEMO-1" +"" +
            "_CASHBOX-DEMO-1-Receipt-ID-1" +
            "_2016-03-11T03:57:08_0,00_0,00_0,00_0,00_0,00"+
            "_4r1iIdZGeAQ=_2a8bc20d_cg8hNU5ihto=");

        string toBeSignedStr = string.Format("{0}.{1}", JWS_Protected_Header, JWS_Payload);
        byte[] tbsBytes = System.Text.Encoding.UTF8.GetBytes(toBeSignedStr);
        byte[] signature;

        ret = rkw.Sign(tbsBytes, out signature);

        if (ret == 0)
        {
            string sigB64 = Base64url(signature);
            Console.WriteLine("Signature:    " + sigB64);

            // Kompletter JWS-Beleg - so im DEP zu finden
            Console.WriteLine("JWS:    " + toBeSignedStr + "." + sigB64);
        }

` Nochmaliges Hashen des toBeSignedStr scheint bei a-Trust nicht nötig zu sein und funktioniert auch nicht. dep.txt crypto.txt

Bin für jeden Rat dankbar!

fschwolow commented 7 years ago

Mit dem Signaturzertifikat stimmt was nicht. Es sollte wie folgt aussehen. DEP.txt enthält das Signaturzertifikat nicht.

MIIFNzCCAx+gAwIBAgIEKovCDTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCQVQxSDBGBgNVBAoMP0EtVHJ1c3QgR2VzLiBmLiBTaWNoZXJoZWl0c3N5c3RlbWUgaW0gZWxla3RyLiBEYXRlbnZlcmtlaHIgR21iSDEjMCEGA1UECwwaQS1UcnVzdCBSZWdpc3RyaWVya2Fzc2UuQ0ExIzAhBgNVBAMMGkEtVHJ1c3QgUmVnaXN0cmllcmthc3NlLkNBMB4XDTE3MDMyNDA4MjYwOVoXDTIyMDMyNDA3MjYwOVowPjELMAkGA1UEBhMCQVQxGDAWBgNVBAMMD1VJRCBERTE1Njc3MTk2NjEVMBMGA1UEBRMMNzAwODU3NTk2NTc2MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZ094UCoMckdtBIeWLvLirFznhOvDoXpl6qLAKLrneJkobKQPa52rv7tlRIRigk/b2vhs3rCOoKVZWE7xhbNtbqOCAaIwggGeMH8GCCsGAQUFBwEBBHMwcTBGBggrBgEFBQcwAoY6aHR0cDovL3d3dy5hLXRydXN0LmF0L2NlcnRzL0EtVHJ1c3QtUmVnaXN0cmllcmthc3NlLUNBLmNlcjAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AuYS10cnVzdC5hdC9vY3NwMA4GA1UdDwEB/wQEAwIGwDARBgNVHQ4ECgQIQJz3MS/J0MEwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NybC5hLXRydXN0LmF0L2NybC9BLVRydXN0LVJlZ2lzdHJpZXJrYXNzZS5DQTAJBgNVHRMEAjAAMFgGA1UdIARRME8wTQYGKigAEQEYMEMwQQYIKwYBBQUHAgEWNWh0dHA6Ly93d3cuYS10cnVzdC5hdC9kb2NzL2NwL0EtVHJ1c3QtUmVnaXN0cmllcmthc3NlMBMGA1UdIwQMMAqACEBHnq7jkN+2MBkGA1UdEQQSMBCBDmluZm9AaXRjb2RlLmRlMBwGByooAAoBCwEEEQwPVUlEIERFMTU2NzcxOTY2MA0GCSqGSIb3DQEBCwUAA4ICAQDLHWmY31TyCcOHwgcJr2zVHngLo9nTunPQ0kjjjMGE1uAUsxI6pi+h78osAPRNODL4/gTlg8/3+fJazJMOo134MfEntdIf3Zz+1zqx3sU71Uz8IwnIJDl6xhpNoWAFSW3Mo9rohacDFNjPZil10hEne54uymas+OG2qQYIRNlC/8wiGg4P25N5o7MovefyMojwhwTD3G40mAz3a+tpuGaH5gGZgcf1QyVA4WekCWeAYbFCIHApkb+IoI1l81LvCruHJEpV7scPLvo/mEFA3icbqj/9cdcwRWfAZLnuMaXWgt6+Om9WGH8bnGzzdDRDKbc2LGzfe48Gfr2fOxn0Z7lBb84tVKbH4Gu2TC6P/D80mjDOLLAKSglPUpw/gWDoXIOoaXCFdaHeBfMmanrLSuhbUSumYV7LjmJ+PHc8pXvUoXF4j+W3x8GLr2d5eRDbyIaZ84u2DqkJd0TDGwV856JXQISH8QAYrLdkoUFk/pxrzHFpVgT4a31vdpJCBq36g6uGrAEWyfOuJye0anIS9UR9sUkurpEn0rNZfiTZSaJ1NbiclPvVauKCo4W5SfIhmDxJV6a3tozHoe25FvfgGReJuEIz/Q0KFAgCP1cmUkekzdl94xvBRJVPf3TjBrFFWDJCCJLPcoPfhWBAGr3rtKT97VLnocoTjvQwXCdC69n2eA==

Die Validierung ist dann OK.

DETAILS: { "verificationId" : "RKSV_DEP_EXPORT", "version" : 1, "verificationName" : "RKSV-DEP-Export Prüfung", "verificationTextualDescription" : "Es wird die Richtigkeit des exportierten RKSV-DEP überprüft: Abfolge der Belege, E ntwicklung des verschlüsselten Umsatzzählers, Verkettung der Belege.", "verificationState" : "PASS", "verificationResultDetailedMessage" : "Die Belege im exportierten RKSV-DEP weisen keinen Fehler auf (Verkettung zu vor igem Beleg, Entwicklung des Umsatzzählers, Belegabfolge).", "input" : { "TURNOVER_SUM" : "0", "SYSTEM_TYPE_INITIAL" : "OPEN", "RECEIPT_PREV" : "NULL", "CASHBOX_ID_INITIAL" : "CASHBOX-DEMO-1", "SIGNED_PENULT" : "NULL", "DECRYPTED_TURNOVER_VALUE" : "0", "SIGNED_PREV" : "NULL", "KNOWN_RECEIPT_IDS" : "NULL", "RECEIPT" : "_R1-AT1_CASHBOX-DEMO-1_CASHBOX-DEMO-1-Receipt-ID-1_2016-03-11T03:57:08_0,00_0,00_0,00_0,00_0,00_4r1iIdZ GeAQ=_2a8bc20d_cg8hNU5ihto=_jHec5rylPyXHZfMWHtZ+SChIDeFK9BcfIEoK9/owJ4sU7rJ6R9dELzj5dziqjvN++sZH91ravuaZsF63VCAUQw==", "RK_SUITE_ID" : "R1", "SYSTEM_TYPE" : "OPEN", "TYPE_RECEIPT" : "START_BELEG", "CASHBOX_ID" : "CASHBOX-DEMO-1", "TYPE_RECEIPT_PREV" : "NULL" }, "verificationTimestamp" : "2017-09-15T08:50:55.961+02:00", "verificationResultList" : [ { "verificationId" : "DEP_STATE", "version" : 1, "verificationName" : "Abfolge der Belege", "verificationTextualDescription" : "In diesem Modul wird überprüft, ob die Abfolge der Belege im exportierten RKSV-D EP korrekt ist: Position des Startbeleges, Position des Sammelbeleges nach dem Ausfall der Signatureinrichtung.", "verificationState" : "PASS", "input" : { "SIGNED_PENULT" : "NULL", "SIGNED_PREV" : "NULL", "TYPE_RECEIPT" : "START_BELEG", "TYPE_RECEIPT_PREV" : "NULL" }, "verificationTimestamp" : "2017-09-15T08:50:55.961+02:00" }, { "verificationId" : "DEP_UNIQUE_RECEIPT_ID", "version" : 1, "verificationName" : "Belegnummer - Mehrfachverwendung", "verificationTextualDescription" : "In diesem Modul wird überprüft ob die selbe Belegnummer mehrfach im RKSV-DEP-Exp ort vorkommt.", "verificationState" : "PASS", "input" : { "KNOWN_RECEIPT_IDS" : "NULL", "RECEIPT_IDENTIFIER" : "CASHBOX-DEMO-1-Receipt-ID-1" }, "output" : { "KNOWN_RECEIPT_IDS" : "_CASHBOX-DEMO-1-Receipt-ID-1" }, "verificationTimestamp" : "2017-09-15T08:50:55.961+02:00" }, { "verificationId" : "DEP_ONLY_ONE_CASHBOX_ID", "version" : 1, "verificationName" : "Eine Kasse pro RKSV-DEP Export", "verificationTextualDescription" : "In diesem Modul wird überprüft, ob der RKSV-DEP-Export, wie vorgeschrieben, nur eine Kassenidentifikationsnummer enthält.", "verificationState" : "PASS", "input" : { "CASHBOX_ID_INITIAL" : "CASHBOX-DEMO-1", "CASHBOX_ID" : "CASHBOX-DEMO-1" }, "verificationTimestamp" : "2017-09-15T08:50:55.961+02:00" }, { "verificationId" : "DEP_ONLY_ONE_SYTEM_TYPE", "version" : 1, "verificationName" : "Prüfung Vermischung der Systeme", "verificationTextualDescription" : "In diesem Modul wird überprüft ob Signatureinrichtungen aus dem geschlossenen Ge samtsystem (AT0) und Signatur/Siegelerstellungseinheiten vermischt werden. Es kann nur ein System-Typ im exportieren RKS V-DEP abgebildet werden.", "verificationState" : "PASS", "input" : { "SYSTEM_TYPE_INITIAL" : "OPEN", "SYSTEM_TYPE" : "OPEN" }, "verificationTimestamp" : "2017-09-15T08:50:55.961+02:00" }, { "verificationId" : "DEP_TURNOVER_COMPARE", "version" : 1, "verificationName" : "Entwicklung des Umsatzzählers", "verificationTextualDescription" : "In diesem Modul wird überprüft, ob die Entwicklung des verschlüsselten Umsatzzäh lers mit den Belegbeträgen übereinstimmt.", "verificationState" : "PASS", "input" : { "DECRYPTED_TURNOVER_VALUE" : "0", "TURNOVER_SUM" : "0", "SUM_TAX_SET_ERMAESSIGT2" : "0,00", "SUM_TAX_SET_ERMAESSIGT1" : "0,00", "SUM_TAX_SET_NORMAL" : "0,00", "TYPE_RECEIPT" : "START_BELEG", "SUM_TAX_SET_NULL" : "0,00", "SUM_TAX_SET_BESONDERS" : "0,00" }, "output" : { "TURNOVER_SUM" : "0" }, "verificationTimestamp" : "2017-09-15T08:50:55.961+02:00" } ] }

RipperFox commented 7 years ago

Seltsam. Ich hatte das schon drin - auch ohne Erfolg, d.h. das Prüftool meldet falsche Signatur bei meinen Testdaten: mydep.txt myqr.txt mycrypto.txt

fschwolow commented 7 years ago

Das Zertifikat in mycrypto.txt ist mMn falsch (codiert). Damit kann auch die Signatur nicht geprüft werden.

ztp-mino commented 7 years ago

Sowohl unser eigenes Tool als auch Openssl sagen, dass das Zertifikat nicht in Ordnung ist. Konkret scheint das ASN.1 im Zertifikat nicht zu passen.

RipperFox commented 7 years ago

Ok, funktioniert :) Ich habe keine Ahnung mehr, woher ich den falschen Wert gehabt habe. Alle getesteten Methoden liefern den selben korrekten Wert:

cotasgmbh commented 7 years ago

Hallo Tom, wir nutzen auch PrimeSign zum signieren. Über welchen Weg holst Du Dir den Schlüssel? Über https://rs-fc8349ca.ps.prime-sign.com/rs/keys/[keyId]/certificate.pem ? Wir hängen genau an der gleichen Stelle.

To0m commented 7 years ago

Hallo @cotasgmbh wir lesen das Zertifikat direkt von der Karte aus. Wie das genau funktioniert ist hier https://tc.prime-sign.com/policies/PrimeSign_RKSV_Signature_Card_Usage_Guide.pdf beschrieben.

cotasgmbh commented 7 years ago

Ok, wir setzen die Online Lösung ein, da läuft das etwas anders. Seid ihr denn weitergekommen mit dem Problem der kryptographische Gültigkeit?

To0m commented 7 years ago

Leider noch nicht, ich hatte allerdings in einem anderen Issue gelesen, dass dort auch mit PrimeSign gearbeitet wurde und dort auch die Probleme mit dem Prüftool bestanden. Beim FON lief es dann aber problemlos durch. Daher ist aktuell unser Plan, dass wir das nächste Woche mal von einem Partner in AT direkt beim FON testen lassen in der Hoffnung, dass dort dann auch die Prüfung ok ist.

cotasgmbh commented 7 years ago

Hallo Tom, zur Info: PrimeSign läuft einwandfrei im Prüftool. Bei uns hing das Problem mit der UTF-8 Codierung zusammen. Vielleicht hilft das.

To0m commented 6 years ago

Bei uns hat es dann auch nich mit dem Prüftool geklappt. Fehler lag bei uns. Problem war, dass wir beim signieren den Punkt zwischen header und payload verschluckt haben.