2011-10-05 3 views
6

Voglio ssh su un server da dietro un altro server ssh. Il server gateway richiede un nome utente/password e posso farlo. Sto usando un tunnel per entrare nel prossimo server, ma questo richiede solo una chiave ssh. Ho generato la chiave tramite PuTTY, quindi esiste per il mio nome utente, ma non sono sicuro di come recuperarlo per il mio programma Java. È una configurazione? per esempio setConfig ("userauth.publickey", "com.jcraft.jsch.UserAuthPublicKey"), allora come faccio a usare questo o qualcos'altro? La documentazione sembra essere scarsa e apprezzo qualsiasi aiuto. Qualche cosa ho provato mi dà un errore: "Auth fail" quando collego questa sessioneJSch: Come ssh su un server usando i tasti ssh

Grazie!

Il metodo di tunnel che uso è: http://sourceforge.net/apps/mediawiki/jsch/index.php?title=ProxySSH così grazie al ragazzo che lo ha scritto!

Per il contesto, mi piacerebbe leggere/scrivere su un server della mia scuola dal mio telefono Android.

risposta

9

Per abilitare public-key authentication, è necessario utilizzare uno dei metodi JSch.addIdentity.

Questi prendono la chiave pubblica e privata nel formato della chiave OpenSSH, quindi assicurati di esportarla da PuTTY in questo formato. (JSch non capisce il formato nativo di PuTTY, sebbene tu possa scrivere un adattatore che implementa l'interfaccia Identity, analizzandolo tu stesso).

Le identità aggiunte a JSch sono globali, non per sessione. Questo normalmente non è un problema, poiché JSch proverà tutti i metodi di autenticazione che sono supportati sia da solo che dal server in ordine, e l'autenticazione a chiave pubblica è normalmente prima dell'autenticazione della password.

Tutti i metodi di autenticazione richiedono un nome utente (di solito il nome dell'account per l'accesso).

Con l'autenticazione a chiave pubblica, la chiave pubblica deve essere in qualche modo precedentemente disponibile per il server. Per sshd di OpenSSH, la chiave pubblica dovrebbe essere elencata in ~/.ssh/authorized_keys. (Se hai solo una chiave pubblica, copiala su questo file, se ne hai più di una (ognuna delle quali sarà consentita), ognuna dovrebbe essere su una riga.)

Quindi dovrebbe funzionare fuori la scatola dopo aver impostato l'identità.

Se si vuole fare in modo la prima sessione utilizza l'autenticazione tramite password e la seconda (tunnel) si usa a chiave pubblica, è possibile utilizzare la configurazione per sessione, sovrascrivendo il Global One:

tunnelSession.setConfig("PreferredAuthentications", "password"); 

innerSession.setConfig("PreferredAuthentications", "publickey"); 

(Questi sono elenchi separati da virgola, qui di un elemento ciascuno.)

Informazioni sull'esempio ProxySSH, che è da me (con l'aiuto dell'autore di JSch, Atsuhiko Yamanaka). Dovrei aggiungere questa informazione alla pagina Wiki, forse.

+0

Poiché il secondo SSH non contiene un nome utente, cosa devo usare per quel campo durante l'istanziazione della sessione? Una stringa vuota o nulla? Ad esempio jsch.getSession (WHAT_GOES_HERE ?, hostname, 22); – Choobs

+0

Continuo a ricevere un errore Auth Fail. Ho id_rsa e id_rsa.pub memorizzati localmente e ho usato PuTTYgen per esportare come chiave OpenSSH quindi usarlo in addIdentity (...). Mi sto perdendo qualcosa? Sul primo server c'è un file /.ssh/authorized_keys, che è una copia di id_rsa.pub, se questo è rilevante. – Choobs

+0

Hai * sempre * bisogno di un nome utente per SSH - non puoi accedere ad un server senza questo. (Dopo tutto, i comandi inviati devono essere eseguiti in qualche account utente locale). E il '.Il file ssh/authorized_keys' (contenente le chiavi pubbliche che sono consentite per il login) deve trovarsi nella directory home dell'utente a cui si desidera accedere. –