Estoy tratando de usar Jsch para establecer una conexión SSH en Java. Mi código produce la siguiente excepción:
com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com.
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4
No puedo encontrar cómo verificar la clave de host en la documentación de Jsch. He incluido mi código a continuación.
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class ssh {
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
//create SSH connection
String host = "mywebsite.com";
String user = "username";
String password = "123456";
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.connect();
} catch(Exception e) {
System.out.println(e);
}
}
}
Respuestas:
Yo tampoco:
ssh
desde la línea de comandos y acepte la clave pública (el host se agregará~/.ssh/known_hosts
y todo debería funcionar bien desde Jsch) -O BIEN-Configure JSch para que no use "StrictHostKeyChecking" (esto introduce inseguridades y solo debe usarse con fines de prueba), utilizando el siguiente código:
La opción n. ° 1 (agregar el host al
~/.ssh/known_hosts
archivo) tiene mi preferencia.fuente
JSch#setConfig("StrictHostKeyChecking", "no")
hará el mismo trabajo, pero en una sola línea~/.ssh/config
archivo para corregir el error anterior cuando no tuve acceso para modificar el código fuenteSi bien la pregunta ha sido respondida en general, me he dado cuenta de que hay un caso en el que incluso la entrada existente de unknown_hosts no ayuda. Esto sucede cuando un servidor SSH envía una huella digital ECDSA y, como resultado, tendrá una entrada como esta:
El problema es que JSch prefiere SHA_RSA y, mientras se conecta, intentará comparar la huella digital SHA-RSA, lo que dará como resultado un error sobre "host desconocido".
Para solucionar esto, simplemente ejecute:
o quejarse con Jcraft acerca de preferir SHA_RSA en lugar de usar la configuración local HostKeyAlgorithms , aunque no parecen estar demasiado ansiosos por corregir sus errores .
fuente
ecdsa-sha2-nistp384
, y su solución funciona muy bien. De acuerdo con el manual openssh-keyscan , y nuestra necesidad, corremosssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.Es un riesgo de seguridad evitar la comprobación de la clave del host.
JSch utiliza la interfaz HostKeyRepository y su clase de implementación predeterminada KnownHosts para administrar esto. Puede proporcionar una implementación alternativa que permita claves específicas mediante la implementación de HostKeyRepository. O puede mantener las claves que desea permitir en un archivo en el formato conocido_hosts y llamar
O con una cadena de clave pública como se muestra a continuación.
ver Javadoc para más detalles.
Esta sería una solución más segura.
Jsch es de código abierto y puede descargar la fuente desde aquí . En la carpeta de ejemplos, busque KnownHosts.java para conocer más detalles.
fuente
Dependiendo del programa que use para ssh, la forma de obtener la clave adecuada podría variar. Putty (popular entre Windows) usa su propio formato para claves ssh. Con la mayoría de las variantes de Linux y BSD que he visto, solo tienes que buscar
~/.ssh/known_hosts
. Por lo general, ssh desde una máquina Linux y luego copio este archivo a una máquina Windows. Entonces uso algo similar aSuponiendo que he colocado el archivo en
C:\Users\cabbott
mi máquina Windows. Si no tiene acceso a una máquina Linux, intente http://www.cygwin.com/Quizás alguien más pueda sugerir otra alternativa de Windows. Encuentro que la forma de masilla de manejar claves SSH almacenándolas en el registro en un formato no estándar es molesto de extraer.
fuente
cygwin
(tienes que descargar elopenssl
paquete y las dependencias) que he podido descargar~/.ssh/known_hosts
. Gracias a @CharityAbbott.Proporcione la clave rsa pública del host: -
fuente
También puedes simplemente hacer
No es seguro y es una solución alternativa que no es adecuada para entornos en vivo, ya que deshabilitará la comprobación de claves de host mundialmente conocidas.
fuente
También puede ejecutar el siguiente código. Está probado y funcionando.
Por favor sustituya los valores apropiados.
fuente
Simplemente sustituya "usuario", "pase", "SSHD_IP". Y cree un archivo llamado known_hosts.txt con el contenido del servidor ~ / .ssh / known_hosts. Obtendrás una concha.
fuente
config.put("StrictHostKeyChecking", "no");
Unassh -v
conexión manual revela que el.ssh/known_hosts
archivo contiene la clave (ecdsa-sha2-nistp256
) pero el código hace esto:com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:...
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
configurar el host conocido es mejor que configurar el valor de impresión de fingura.
Cuando configure el host conocido, intente ssh manualmente (por primera vez, antes de que se ejecute la aplicación) desde el cuadro en que se ejecuta la aplicación.
fuente
Perdí mucho tiempo en este estúpido problema, y creo que el mensaje es bastante correcto "no hay un host en el archivo al que estoy accediendo", pero puede tener más de un archivo know_host en su sistema (como ejemplo i Estoy usando mobaXterm y se mantiene dentro del directorio de instalación que monta el hogar desde esa raíz).
Si está experimentando: está funcionando desde la línea de comandos pero no desde la aplicación, intente acceder a su servidor remoto con ssh y verifique con la opción detallada -v qué archivo se usa actualmente, un ejemplo a continuación:
como puede ver, la clave se encontró en:
y no en mi casa de Windows en C: \ Users \ my_local_user \ .ssh, simplemente los fusioné y alineé para resolver el problema.
Espero que esto ayude a alguien en el futuro
fuente
Esta entrada de stackoverflow trata sobre la comprobación de la clave del host, y no hay relación con la autenticación de clave pública.
En cuanto a la autenticación de clave pública, pruebe el siguiente ejemplo con su clave privada simple (no cifrada),
fuente
fuente