Code Beispiel: Gemischter Erfolg...

170 views
Skip to first unread message

Michael Holste

unread,
Jan 19, 2018, 5:23:54 AM1/19/18
to hbci4java
Hallo,

ich habe mir das Code-Beispiel unter
https://github.com/hbci4j/hbci4java/blob/master/src/main/java/org/kapott/hbci/examples/UmsatzAbrufPinTan.java
mal etwas genauer angesehen und habe den Code mit leichten Modifikationen für mich übernommen. Anfangs hat alles wunderbar geklappt und lief auch wirklich problemlos, nur bin ich jetzt leider auf ein Problem gestoßen: In meinem Programm möchte ich mehrere HBCI-Zugänge konfigurieren. Der erste kann wunderbar analog zum Codebeispiel angelegt werden, bei der Konfiguration des zweiten Zugangs kommt es dann zu einem Fehler:

...
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: *** loading of passport file failed
    at org
.kapott.hbci.passport.HBCIPassportPinTan.read(HBCIPassportPinTan.java:237)
    at org
.kapott.hbci.passport.HBCIPassportPinTan.<init>(HBCIPassportPinTan.java:104)
    at sun
.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun
.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun
.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java
.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org
.kapott.hbci.passport.AbstractHBCIPassport.getInstance(AbstractHBCIPassport.java:719)
    at org
.kapott.hbci.passport.AbstractHBCIPassport.getInstance(AbstractHBCIPassport.java:757)
    at org
.kapott.hbci.passport.AbstractHBCIPassport.getInstance(AbstractHBCIPassport.java:769)
    at de
.mho.finpim.service.FinPimBankingImpl.initBanking(FinPimBankingImpl.java:124)
    at de
.mho.finpim.service.FinPimBankingImpl.fetchAccounts(FinPimBankingImpl.java:36)
    at de
.mho.finpim.ui.parts.banking.BankAccountSelectionPart.createControls(BankAccountSelectionPart.java:68)
    at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun
.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java
.lang.reflect.Method.invoke(Method.java:498)
    at org
.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
   
... 68 more
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Erzeugen des Schlüssels aus dem Passwort
    at org
.kapott.hbci.passport.AbstractHBCIPassport.calculatePassportKey(AbstractHBCIPassport.java:807)
    at org
.kapott.hbci.passport.HBCIPassportPinTan.read(HBCIPassportPinTan.java:181)
   
... 84 more
Caused by: org.kapott.hbci.exceptions.InvalidUserDataException: Passwort darf nicht leer sein
    at org
.kapott.hbci.passport.AbstractHBCIPassport.calculatePassportKey(AbstractHBCIPassport.java:794)
   
... 85 more

Erstmal zur Aufklärung hier die Methode, in der die Exception fliegt:

private HBCIPassport initBanking(Bank b)
   
{
       
Properties props = new Properties();
       
HBCIUtils.init(props, new HBCICallbackFinPim(b));
       
       
final File passportFile = new File("PP.dat");
       
HBCIUtils.setParam("client.passport.default","PinTan"); // Legt als Verfahren PIN/TAN fest.
       
HBCIUtils.setParam("client.passport.PinTan.filename",passportFile.getAbsolutePath());
       
HBCIUtils.setParam("client.passport.PinTan.init","1");
       
       
HBCIPassport passport = AbstractHBCIPassport.getInstance();
        passport
.setCountry("DE");
       
BankInfo info = HBCIUtils.getBankInfo(b.getBlz());
        passport
.setHost(info.getPinTanAddress());
        passport
.setPort(443);
        passport
.setFilterType("Base64");
       
       
return passport;        
   
}

Zur weiteren Information: Nach diesem Aufruf der initBanking Methode werden in einer weiteren Methode die Kontoinformationen abgerufen. Das wird logischerweise durch einen HBCIJob erledigt.Diese Methode wird vor der Rückgabe des Ergebnisses so terminiert:
        ...
        handle.close();
        HBCIUtils.doneThread();
        ...
Interessanterweise tritt exakt derselbe Fehler auch dann auf, wenn ich die Bankverbindung, die ich hier im zweiten Schritt anlegen will, gleich als erstes anlegen will?! Weshalb aber wird nun überhaupt versucht, dass Passportfile zu laden und einen entsprechenden Schlüssel dafür zu erzeugen? Das hier steht ja im Kommentar des Beispielcodes:
// In der Passport-Datei speichert HBCI4Java die Daten des Bankzugangs (Bankparameterdaten, Benutzer-Parameter, etc.).
// Die Datei kann problemlos geloescht werden. Sie wird beim naechsten mal automatisch neu erzeugt,
// wenn der Parameter "client.passport.PinTan.init" den Wert "1" hat (siehe unten).
// Wir speichern die Datei der Einfachheit halber im aktuellen Verzeichnis
Daher bin ich bisher davon ausgegangen, dass diese Datei außer Acht gelassen werden kann.Ist dem vielleicht doch nicht so?

Danke für eine Aufklärung,
Michael



Olaf Willuhn

unread,
Jan 19, 2018, 5:49:15 AM1/19/18
to hbci...@googlegroups.com
Du brauchst pro Bankzugang eine eigene Passport-Datei. Der Parameter "client.passport.PinTan.init" dient dazu, die Passport-Datei on-demand zu erstellen, falls sie noch nicht existirt. Wenn aber bereits eine da ist, dann wird diese verwendet. Und die stammt dann halt vom falschen Bankzugang. Achte bitte ausserdem darauf, dass im Callback auch die für den jeweils passenden Bankzugang benötigten Daten geliefert werden und nicht immer die selbe PIN.

Michael Holste wrote:
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "hbci4java" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an hbci4java+...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an hbci...@googlegroups.com.
Gruppe besuchen: https://groups.google.com/group/hbci4java
Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie https://groups.google.com/d/msgid/hbci4java/e4cde3de-2c11-46e0-beea-b747264c1951%40googlegroups.com auf.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.

Michael Holste

unread,
Jan 19, 2018, 7:06:07 AM1/19/18
to hbci4java
Hmm, diese Erklärung ist völlig logisch und verständlich. Das nun von mir beobachtete Verhalten passt leider so gar nicht. Ich abe nun zunächst das alte Passportfile von meiner Platte gelöscht, um sicher zu gehen, dass ich wirklich sauber und von vorne anfange. Dann habe ich versucht, gleich den ehemaligen "zweiten" Zugang anzulegen. Ich bae daraufhin wieder exaKt die gleiche Fehlermeldung erhalten!?  Das verstehe ich nun nicht so ganz... Denn es ist ja nun definitiv auf dem ganzen System keine Passwortdatei mehr vorhanden! Wie also soll da also was aufgemacht werden, das gar nicht vorhanden ist? Noch dazu mit irgendeinem niemals vorhanden gewesenem Passwort? Jetzt muss doch diese Datei nun wirklich neu erzeugt werden, oder? Auch nach dem Ende des Programms wurde die Datei jedenfalls nicht angelegt...
Ganz wild wurde es aber als ich dann eben spaßeshalber versucht habe, den ehemals ersten Zugang, der ja schon mal vorhanden war, wieder anzulegen. Das hat nämlich problemlos funktioniert?! Wie geht denn sowas? Entweder ist die Datei nicht da oder sie wird irgendwo hergezaubert? Nicht wirklich, also muss es doch einen Grund geben...
Gruß,
Michael

Olaf Willuhn

unread,
Jan 19, 2018, 7:30:25 AM1/19/18
to hbci...@googlegroups.com
Michael Holste wrote:
> Hmm, diese Erklärung ist völlig logisch und verständlich. Das nun von
> mir beobachtete Verhalten passt leider so gar nicht. Ich abe nun
> zunächst das alte Passportfile von meiner Platte gelöscht, um sicher
> zu gehen, dass ich wirklich sauber und von vorne anfange. Dann habe
> ich versucht, gleich den ehemaligen "zweiten" Zugang anzulegen. Ich
> bae daraufhin wieder exaKt die gleiche Fehlermeldung erhalten!? 

Ohne den vollstaendigen Code oder genaue Stacktraces kann ich da auch
nur spekulieren. Wenn da aber die Meldung kommt, dass das Passwort der
Passport-Datei nicht leer sein darf, dann hast du da eventuell keines im
Callback zurueckgeliefert.


Michael Holste

unread,
Jan 19, 2018, 7:38:25 AM1/19/18
to hbci4java

Au weia, das war jetzt ein guter Punkt! Mein Callback liefert als Passwort der Einfachheit halber die Kunden-ID zurück. Und genau die habe ich beim "zweiten" Zugang leer gelassen! Oh weh, da habe ich den Wald vor lauter Bäumen nicht gesehen!

Olaf Willuhn

unread,
Jan 19, 2018, 8:34:19 AM1/19/18
to hbci...@googlegroups.com
Hauptsache die Ursache ist gefunden ;)

Reply all
Reply to author
Forward
0 new messages