From 7266c147f8a596da4f6a0e9484d52fc699f89eb6 Mon Sep 17 00:00:00 2001 From: Martin Berger <> Date: Fri, 17 Mar 2023 18:46:39 +0100 Subject: [PATCH] Prepared for automatic setup --- README.md | 20 +++++++++---- config/fuelifints.properties | 6 ++-- dbsetup.sql | 30 ++++++++++--------- .../BlockingSSLRequestListenerThread.java | 2 +- .../cryptography/aesencryption/AESUtil.java | 5 ++++ 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index b70b4c7..e74f66a 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,25 @@ Fueli FinTS is a server implementing the financial transaction services (FinTS) 3. FIXMEs to deactivate PIN/mTAN/strong authentication where necessary for testing purposes. **CAUTION: Do not use this fork in production without fixing these issues!!!** 4. Added example configuration files and db script to set up a rudimentary database. 5. Some minor refactoring and cleanups +6. Adapted for Bitcoin Lightning Network integration with [LNbits](https://github.com/lnbits/lnbits#lnbits) **Please find a complete list of all changes to the original implementation by this fork with this [Github Compare](https://github.com/petafuel/FueliFinTS/compare/main...drmartinberger:lnbits-via-mt940) view.** # Setup Steps -1. Configure `fuelifints.properties` -2. Initialize keystore (to be set in `fuelifints.properties`) -3. Setup `FinTS_Produktregistrierungen_Lizenzdatei.csv` (to be set in `fuelifints.properties`, contains product client ids that are allowed to communicate with server) or set a `productinfo.csv.check=false` -4. Define aeskey.properties with a valid 128-bit key (to be set in `fuelifints.properties`) -5. Setup file .banking2.properties (to set config params for persistence layer, blz is configured in `fuelifints.properties` and your database) -6. Init database: +1. Configure `config/fuelifints.properties` +2. Initialize keystore (to be set in `config/fuelifints.properties`) +3. Setup `FinTS_Produktregistrierungen_Lizenzdatei.csv` (to be set in `config/fuelifints.properties`, contains product client ids that are allowed to communicate with server) or set a `productinfo.csv.check=false` +4. Setup `aeskey.properties` with a valid 128-bit key (file to be set in `config/fuelifints.properties`) +5. Setup file `config/12345678.banking2.properties` (to set config params for persistence layer, `bankcode = 12345678` is configured in `config/fuelifints.properties` and your database) +6. Derive encrypted PIN (for FinTS access) for your intended `, e.g. 123456789` and inject it into `dbsetup.sql`: + +```bash +$ encryptedPIN=`mvn compile exec:java -Dexec.mainClass="net.petafuel.fuelifints.cryptography.aesencryption.AESUtil" -Dexec.args="" -q` +$ sed -i -e "s/REPLACE_ENCRYPTED_PIN/$encryptedPIN/g" dbsetup.sql +``` + +7. Init database: 1. Install mysql 2. Initialize database from mysql command line: 1. Add database user e.g. `fintsuser` with `` (both must be used in `connectionpool.properties` adapted from `connectionpool.properties.example`): diff --git a/config/fuelifints.properties b/config/fuelifints.properties index 439742e..5f01782 100644 --- a/config/fuelifints.properties +++ b/config/fuelifints.properties @@ -5,11 +5,11 @@ server_ip = 127.0.0.1 # SSL Keystore: keystore_location = src/main/resources/keystore/your_keystore -keysotre_password = yourkeystorepassword +keystore_password = yourkeystorepassword # Default Bank Settings: bankcode = 12345678 -bankname = FueliFinTS Testbank +bankname = LNBank # RDH Keystore: rdh_keystore_location = rdh.ks @@ -53,5 +53,5 @@ hbci.security.protocols=PIN_2;RDH_9;RDH_10;RAH_9;RAH_10 dialog.timeout.millis=60000 productinfo.csv.filepath=FinTS_Produktregistrierungen_Lizenzdatei.csv -productinfo.csv.check=true +productinfo.csv.check=false productinfo.csv.startRow=10 diff --git a/dbsetup.sql b/dbsetup.sql index ceea025..49b571f 100644 --- a/dbsetup.sql +++ b/dbsetup.sql @@ -1,34 +1,36 @@ -- Rough reverse-engineered database structure for FueliFinTS --- 1. Set your intended benutzerkennung for --- 2. Set your intended encrypted PIN for --- 3. Set your intended kundenid for --- 4. Set and as in config/fuelifints.properties --- 5. Set your intended , and +-- 1. To set your intended benutzerkennung(=FinTS user), change value 'fintsUser' +-- 2. To set your intended encrypted PIN(=encrypted FinTS PIN), change value '$encryptedPIN' with outcome of +-- mvn compile exec:java -Dexec.mainClass="net.petafuel.fuelifints.cryptography.aesencryption.AESUtil" -Dexec.args="" -q +-- (!!!ATTENTION!!!: before encrypting PIN, aes_key (128) needs to be set in aeskey.properties in hex format, e.g. aes_key=770A8A65DA156D24EE2A093277530142) +-- 3. To set your intended kundenid, change value 'kundenid1' +-- 4. To set your intended BLZ and Bankname, change values '12345678' and 'LNBank' (as in config/fuelifints.properties) +-- 5. To set your intended kontoid, kontonummer and kontoinhaber, change values 'kontoid1', '666666' and 'kontoinhaber1' -- 6. Set other values where feasible CREATE TABLE benutzerkennungen (pin varchar(255), lastnn varchar(255), benutzerkennung varchar(255)); -INSERT INTO benutzerkennungen (pin, lastnn, benutzerkennung) VALUES ('', 'lastnn', ''); +INSERT INTO benutzerkennungen (pin, lastnn, benutzerkennung) VALUES ('REPLACE_ENCRYPTED_PIN', 'lastnn', 'fintsUser'); CREATE TABLE kunden_benutzerkennungen (kundenid varchar(255), benutzerkennung varchar(255)); -INSERT INTO kunden_benutzerkennungen (kundenid, benutzerkennung) VALUES ('', ''); +INSERT INTO kunden_benutzerkennungen (kundenid, benutzerkennung) VALUES ('kundenid1', 'fintsUser'); CREATE TABLE bpd (version varchar(255), blz varchar(255), bankname varchar(255), anzgesch varchar(255), lang varchar(255), hbciversion varchar(255), maxsize varchar(255)); -INSERT INTO bpd (version, blz, bankname, anzgesch, lang, hbciversion, maxsize) VALUES ('1', '', '', '1', 'GER', '300', '0'); -- blz and bankname should match fuelifints.properties +INSERT INTO bpd (version, blz, bankname, anzgesch, lang, hbciversion, maxsize) VALUES ('1', '12345678', 'LNBank', '1', 'GER', '300', '0'); -- blz and bankname should match fuelifints.properties CREATE TABLE geschaeftsvorfaelle(bezeichnung varchar(255), segmentversion varchar(255), maxanzahl INT, param1 INT, param5 varchar(255), param3 varchar(255), param4 varchar(255), bpdversion varchar(255), hbciversion varchar(255)); INSERT INTO geschaeftsvorfaelle (bezeichnung, segmentversion, maxanzahl, param1, param5, param3, param4, bpdversion, hbciversion) VALUES ('Geschaeftsvorfall Bezeichnung', 'Segmentversion 1', 1, 1, '1', '1', '1', '1', '300'); CREATE TABLE messages_read(messageid varchar(255), loginid varchar(255), benutzerkennung varchar(255)); CREATE TABLE messages(messageid varchar(255), subject varchar(255), text varchar(255)); CREATE TABLE tempclientstuff3(benutzerkennung varchar(255), kundenid varchar(255), produkt varchar(255), produktversion varchar(255), kundensystemid varchar(255), dialogid varchar(255), tanid varchar(255), kontrollref varchar(255)); CREATE TABLE konten(kontoid VARCHAR(255), kontonummer VARCHAR(255), kontoinhaber VARCHAR(35), kontostand VARCHAR(35), tagesumsatz VARCHAR(35), tageslimit VARCHAR(35), kontoart VARCHAR(2), virtkontostand VARCHAR(35), kreditlinie_aktiv BOOLEAN, kreditlinie VARCHAR(35), ueberziehen BOOLEAN, konto_pre VARCHAR(255), blz_pre VARCHAR(255), iban_pre VARCHAR(255), empfaenger_pre VARCHAR(255)); -INSERT INTO konten(kontoid, kontonummer, kontoinhaber, kontostand, tagesumsatz,tageslimit,kontoart,virtkontostand,kreditlinie_aktiv,kreditlinie,ueberziehen,konto_pre,blz_pre,iban_pre,empfaenger_pre) VALUES ('','', '','66.66','66.66','66.66', '90','66.66',true,'66.66',true,'','','',''); +INSERT INTO konten(kontoid, kontonummer, kontoinhaber, kontostand, tagesumsatz,tageslimit,kontoart,virtkontostand,kreditlinie_aktiv,kreditlinie,ueberziehen,konto_pre,blz_pre,iban_pre,empfaenger_pre) VALUES ('kontoid1','666666', 'kontoinhaber1','0.00','0.00','0.00', '90','0.00',true,'0.00',true,'','','',''); CREATE TABLE konten_bewegungen(kontoid VARCHAR(255), kontostand VARCHAR(35), buchungsdatum DATE, bewegungsid BIGINT(20)); -- comment out INSERT INTO konten_bewegungen, if you do not want to have account transactions -INSERT INTO konten_bewegungen(kontoid, kontostand, buchungsdatum, bewegungsid) VALUES ('', '66.66', '2022-11-11', 1); +--INSERT INTO konten_bewegungen(kontoid, kontostand, buchungsdatum, bewegungsid) VALUES ('kontoid1', '66.66', '2022-11-11', 1); CREATE TABLE kunden_konten(kontoid VARCHAR(255), kundenid VARCHAR(255)); -INSERT INTO kunden_konten(kontoid, kundenid) VALUES ('', ''); +INSERT INTO kunden_konten(kontoid, kundenid) VALUES ('kontoid1', 'kundenid1'); CREATE TABLE login_konten_permission(kontoid VARCHAR(255), benutzerkennung varchar(255), ueberweisung VARCHAR(1), sdd VARCHAR(1), ade VARCHAR(1), azv VARCHAR(1), lastschrift VARCHAR(1), abbuchung VARCHAR(1), dtaus VARCHAR(1)); -INSERT INTO login_konten_permission(kontoid, benutzerkennung, ueberweisung, sdd, ade, azv, lastschrift, abbuchung, dtaus) VALUES ('', '', '1', '1', 'E', '1', '1', '1', '1'); +INSERT INTO login_konten_permission(kontoid, benutzerkennung, ueberweisung, sdd, ade, azv, lastschrift, abbuchung, dtaus) VALUES ('kontoid1', 'fintsUser', '1', '1', 'E', '1', '1', '1', '1'); CREATE TABLE logins(loginid VARCHAR(255), handy VARCHAR(255), ref_benutzerkennung VARCHAR(255)); -INSERT INTO logins(loginid, handy, ref_benutzerkennung) VALUES (0, '0815666', ''); +INSERT INTO logins(loginid, handy, ref_benutzerkennung) VALUES (0, '0815666', 'fintsUser'); CREATE TABLE tanliste_mobil(mtanid INT AUTO_INCREMENT PRIMARY KEY, mtan VARCHAR(255), used VARCHAR(255), loginid VARCHAR(255),benutzerkennung VARCHAR(255), request VARCHAR(255)); -INSERT INTO tanliste_mobil(mtanid, mtan, used, loginid, benutzerkennung, request) VALUES (0, '123456', '0', 0, '', 'request'); +INSERT INTO tanliste_mobil(mtanid, mtan, used, loginid, benutzerkennung, request) VALUES (0, '123456', '0', 0, 'fintsUser', 'request'); CREATE TABLE login_permission(tageslimit VARCHAR(35), tagesumsatz VARCHAR(35), lastschrift VARCHAR(1), ueberweisung VARCHAR(1), benutzerkennung varchar(255)); CREATE TABLE mt940(mt940id VARCHAR(255), mt940 BLOB, kontoid VARCHAR(255), buchungstag date); CREATE TABLE vorabumsaetze(kontoid VARCHAR(255), buchungsdatum date, primanota VARCHAR(35), verwendungszweck VARCHAR(140), betrag VARCHAR(35), kontostand VARCHAR(35), wert VARCHAR(35), refimportid VARCHAR(35), gegenkontoname VARCHAR(35), gegenkontonr VARCHAR(35), gegenkontoblz VARCHAR(35), bewegungsid VARCHAR(35)); diff --git a/src/main/java/net/petafuel/fuelifints/communication/BlockingSSLRequestListenerThread.java b/src/main/java/net/petafuel/fuelifints/communication/BlockingSSLRequestListenerThread.java index 035092c..1fea011 100644 --- a/src/main/java/net/petafuel/fuelifints/communication/BlockingSSLRequestListenerThread.java +++ b/src/main/java/net/petafuel/fuelifints/communication/BlockingSSLRequestListenerThread.java @@ -66,7 +66,7 @@ public class BlockingSSLRequestListenerThread extends Thread { properties.load(bis); bis.close(); systemProps.put("javax.net.ssl.keyStore", properties.getProperty("keystore_location")); - systemProps.put("javax.net.ssl.keyStorePassword", properties.getProperty("keysotre_password")); + systemProps.put("javax.net.ssl.keyStorePassword", properties.getProperty("keystore_password")); useCipherSuites = properties.getProperty("use_cipher_suites").split(";"); useProtocols = properties.getProperty("use_protocols").split(";"); } catch (Exception e) { diff --git a/src/main/java/net/petafuel/fuelifints/cryptography/aesencryption/AESUtil.java b/src/main/java/net/petafuel/fuelifints/cryptography/aesencryption/AESUtil.java index 2c4ad39..d7c4696 100644 --- a/src/main/java/net/petafuel/fuelifints/cryptography/aesencryption/AESUtil.java +++ b/src/main/java/net/petafuel/fuelifints/cryptography/aesencryption/AESUtil.java @@ -14,6 +14,11 @@ import java.util.Properties; public class AESUtil { private static final Logger LOG = LogManager.getLogger(AESUtil.class); + public static void main (String[] args) { + System.out.println(aesEncrypt(args[0].getBytes())); + System.exit(0); + } + /** * Expects a payload to encrypt and returns the encryption result as Base64 * @param toEncrypt