2011-10-05 34 views
6

Quiero enviar ssh a un servidor desde detrás de otro servidor ssh. El servidor de puerta de enlace requiere un nombre de usuario/contraseña y puedo hacerlo. Estoy utilizando un túnel para acceder al siguiente servidor, pero este requiere solo una clave ssh. He generado la clave a través de PuTTY, por lo que existe para mi nombre de usuario, pero no estoy seguro de cómo recuperarlo para mi programa Java. ¿Es una configuración? es decir, setConfig ("userauth.publickey", "com.jcraft.jsch.UserAuthPublicKey") entonces, ¿cómo uso esto o algo más? La documentación parece escasa y agradezco cualquier ayuda. Todo lo que he intentado me da un error: "Auth fail" cuando conecto esta sesiónJSch: Cómo enviar ssh a un servidor usando ssh-keys

¡Gracias!

El método de túnel que uso es: http://sourceforge.net/apps/mediawiki/jsch/index.php?title=ProxySSH ¡así que gracias al tipo que lo escribió!

Por contexto, me gustaría leer/escribir en un servidor en mi escuela desde mi teléfono Android.

Respuesta

9

Para habilitar public-key authentication, tiene que usar uno de los métodos JSch.addIdentity.

Éstos toman la clave pública y privada en el formato de clave OpenSSH, así que asegúrese de exportarlo desde PuTTY en este formato. (JSch no comprende el formato nativo de PuTTY, aunque podría escribir un adaptador que implemente la interfaz Identity, analizándolo usted mismo).

Las identidades añadidas a JSch son globales, no por sesión. Esto normalmente no es un problema, ya que JSch probará todos los métodos de autenticación que son compatibles tanto por sí mismo como por el servidor en orden, y la autenticación de clave pública es normalmente antes de la autenticación con contraseña.

Todos los métodos de autenticación necesitan un nombre de usuario (generalmente el nombre de la cuenta para iniciar sesión).

Con la autenticación de clave pública, la clave pública debe estar previamente disponible de alguna manera para el servidor. Para el sshd de OpenSSH, la clave pública debe aparecer en ~/.ssh/authorized_keys. (Si solo tiene una clave pública, simplemente cópiela en este archivo, si tiene varias (cada una de ellas estará permitida), cada una debe estar en una línea).

Así que debería funcionar fuera de la caja después de establecer la identidad.

Si desea asegurarse de que la primera sesión utiliza la autenticación de contraseña y la segunda (túnel) se utiliza en clave pública, puede utilizar la configuración por sesión, anulando el global:

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

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

(Estas son listas separadas por comas, aquí de un elemento cada una).

Acerca del ejemplo de ProxySSH, eso es mío (con la ayuda del autor de JSch, Atsuhiko Yamanaka). Debo añadir esta información a la página Wiki, tal vez.

+0

Dado que el segundo SSH no incluye un nombre de usuario, ¿qué debería usar para ese campo al crear una instancia de la sesión? Una cadena vacía o nulo? es decir, jsch.getSession (WHAT_GOES_HERE ?, nombre de host, 22); – Choobs

+0

Sigo recibiendo un error de falla de autenticación. Tengo id_rsa e id_rsa.pub almacenados localmente y usé PuTTYgen para exportar como clave OpenSSH y luego lo uso en addIdentity (...). ¿Me estoy perdiendo de algo? En el primer servidor hay un archivo /.ssh/authorized_keys, que es una copia de id_rsa.pub, si es relevante. – Choobs

+0

Usted * siempre * necesita un nombre de usuario para SSH; no puede iniciar sesión en un servidor sin esto. (Después de todo, los comandos enviados tienen que ejecutarse en alguna cuenta de usuario local). Y el '.El archivo ssh/authorized_keys' (que contiene las claves públicas que están permitidas para iniciar sesión) debe estar en el directorio inicial del usuario con el que desea iniciar sesión. –

Cuestiones relacionadas