[SSH]sshJ+BouncyCastle+Solaris

Hallo zusammen,

ich habe folgendes Problem, über das ich schon länger grüble:

Ich will per Java eine SSH-Verbindung von einer Solaris-Maschine zu einer anderen erstellen, Authentifizierung läuft über Key und ist über Konsole kein Problem.

Ich benutze als SSH-Bibliothek ‘sshJ’ und als Securityprovider ‘BouncyCastle’, dies ist der Konstruktor meiner Klasse:

        super(host);
Security.addProvider(new BouncyCastleProvider());
this.client = new SSHClient();
this.client.addHostKeyVerifier(fingerprint);
PKCS8KeyFile keyFile = new PKCS8KeyFile();
keyFile.init(new File(pathToKey));
this.client.authPublickey(userName, keyFile);```

Im entsprechenden JDK habe ich die Unrestricted-Policies-Jars eingesetzt.

Ich habe es lokal unter Windows getestet und es hat wunderbar funktioniert, alles kein Problem.
Aber sobald ich auf Solaris eine SSH-Verbindung damit öffnen will kommt folgender Fehler(Zielserver war sowohl auf Windows als auch unter Solaris derselbe):

```net.schmizz.sshj.transport.TransportException: Unable to reach a settlement: [] and [aes128-ctr, aes128-cbc, arcfour, 3des-cbc, blowfish-cbc, aes192-ctr, aes192-cbc, aes256-ctr, aes256-cbc]
        at net.schmizz.sshj.transport.Proposal.firstMatch(Proposal.java:165)
        at net.schmizz.sshj.transport.Proposal.negotiate(Proposal.java:147)
        at net.schmizz.sshj.transport.KeyExchanger.gotKexInit(KeyExchanger.java:239)
        at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:364)
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:477)
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:127)
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:195)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:72)```

Hat jemand eine Idee woran das liegen könnte? (Schaut so aus, als ob die Maschinen sich nicht auf eine Encryption einigen können - aber warum?)

irgendwie fehlt die explizite angabe das BC zu verwenden ist , denn ohne diese wird der erste passende provider gewählt , und ich denke an genau diesem punkt dürfte sich was zwischen deinem win-client und dem solaris-server unterscheiden

irgendwo müsstest du an die lib auch die info übergeben können das BC zu verwenden ist
ansonsten bleibt dir nur über via reflections alle anderen vorher zu de-registrieren um sicherzugehen das auch wirklich BC genutzt wird

Hallo „Unregistriert“ :slight_smile:

Danke für die Antwort, das ist etwas, was ich auf jeden Fall morgen auf der Arbeit ausprobieren werde, inzwischen bin ich „leider“ zu Hause :slight_smile:

Ich habe diesen Link auf der Homepage von BouncyCastle gefunden:
http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation

Ich werde mal versuchen es statisch zu installieren und schauen, ob sich irgendwas ändert.
Ich werde dann mal Rückmeldung geben.

Aber btw: Ich hätte ganz stark vermutet, dass ich den Provider schon mit

Security.addProvider(new BouncyCastleProvider());

registriere, welchen Sinn hätte das sonst.

Grüße,
Shadoka

Ich habe den Code von sshj mal kurz auf github durchgesehen. Es wird dort gezielt abgefragt ob BouncyCastle schon registriert wurde und wenn nicht wird automatisch versucht BC zu registrieren. Von daher würde ich schonmal davon ausgehen das sshj BC verwenden wird wenn möglich.

Ich hatte auch zuerst vergessen die Policy-Jars auszutauschen und war von der Art des Fehlers auch recht überzeugt, dass das Austauschen das Problem lösen würde. Tat es leider nicht.

Da ja Win --> Solaris funktioniert nehme ich mal stark an, dass entweder sshJ oder BouncyCastle nicht ganz plattformunabhängig geschrieben ist.

Guten Morgen,

sorry für den Doppelpost, aber bis jetzt hält das Problem immer noch an.

Ich hab unter lib/security mal in dem File java.security rumgeschnuddelt und das hier gefunden:

security.provider.1=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg

Da wird als Defaultprovider irgendetwas anderes als der Standardprovider von Sun definiert (sun.security.provider.Sun). Auf der Website von BouncyCastle habe ich gelesen, dass dies zu Problemen führen könnte, wenn man das tut.

Könnte das ein Grund sein?

Ich habe die Lösung gefunden, trotz Tripplepost werde ich die Lösung getreu dem Motto ‘Sharing is caring’ posten.

Unter Solaris muss man im jeweiligen JDK oder JRE unter ‘lib/ext’ das jeweilige BouncyCastleProvider-Jar reinpacken, in meinem Fall ‘bcprov-jdk15on-1.49.jar’. Man braucht nichts in der ‘java.security’-Datei zu ändern.

Ich habe keine vernünftige Erklärung dafür, warum sich das JDK da unter Solaris anders verhält, ich habe die Lösung durch Ausprobieren gefunden.

Grüße und danke nochmal für die Beiträge von euch

ich glaube DAS ist irgendwie nicht wirklich die lösung
viel eher solltest du mal deinen classpath überprüfen das dieser die BC-lib auch mit einbindet anstatt einfach mal was ins lib/ext zu werfen
ist zwar das lindern des symptomes , nicht aber das beseitigen der ursache

Habe ich schon gecheckt, Maven hat brav gebaut.

Es ist auch keine verteilte Software, deswegen ist das jetzt nicht das Schlimmste, wenn ich halt das Jar in den Ordner werfe.

naja, das einzige was ich mir jetzt noch vorstellen kann ist das BC an irgendeinem punkt “früher” geladen wird wenn es in lib/ext liegt als wenns normal im CP vorhanden ist
und das die ssh-lib halt genau darauf aufbaut

alles schon irgendwie sehr merkwürdig, vor allem weils unter win ja “normal” läuft ohne BC in lib/ext

kanns leider nicht nachvollziehen da ich solaris nicht zum laufen bekomme
entweder haut mir das graphische setup ne exception an kopf oder das text-setup hängt sich irgendwann auf
ich habs mitlerweile einfach aufgegeben