Estou tentando usar o Jsch para estabelecer uma conexão SSH em Java. Meu código produz a seguinte exceção:
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
Não consigo encontrar como verificar a chave do host na documentação do Jsch. Eu incluí meu código abaixo.
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);
}
}
}
Respostas:
Eu iria:
ssh
na linha de comando e aceite a chave pública (o host será adicionado~/.ssh/known_hosts
e tudo deverá funcionar bem no Jsch) -OR-Configure o JSch para não usar "StrictHostKeyChecking" (isso introduz inseguranças e deve ser usado apenas para fins de teste), usando o seguinte código:
A opção 1 (adicionar o host ao
~/.ssh/known_hosts
arquivo) tem minha preferência.fonte
JSch#setConfig("StrictHostKeyChecking", "no")
fará o mesmo trabalho, mas em apenas uma linha~/.ssh/config
arquivo de corrigir o erro acima quando eu não tinha acesso a modificar o código fonteEmbora a pergunta tenha sido respondida em geral, percebi que há um caso em que mesmo a entrada existente de known_hosts não ajuda. Isso acontece quando um servidor SSH envia uma impressão digital ECDSA e, como resultado, você terá uma entrada como esta:
O problema é que o JSch prefere o SHA_RSA e, ao conectá-lo, tentará comparar a impressão digital do SHA-RSA, o que resultará em erro sobre "host desconhecido".
Para corrigir isso, execute:
ou reclame com a Jcraft sobre preferir o SHA_RSA em vez de usar a configuração local HostKeyAlgorithms , embora eles não pareçam estar muito ansiosos para corrigir seus erros .
fonte
ecdsa-sha2-nistp384
, e sua solução funciona muito bem. De acordo com o manual openssh-keyscan , e nossa necessidade, corremosssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.É um risco de segurança evitar a verificação da chave do host.
JSch usa a interface HostKeyRepository e sua classe KnownHosts de implementação padrão para gerenciar isso. Você pode fornecer uma implementação alternativa que permita chaves específicas implementando HostKeyRepository. Ou você pode manter as chaves que deseja permitir em um arquivo no formato known_hosts e chamar
Ou com uma chave pública String como abaixo.
veja Javadoc para mais detalhes.
Essa seria uma solução mais segura.
Jsch é de código aberto e você pode fazer o download do código aqui . Na pasta de exemplos, procure KnownHosts.java para saber mais detalhes.
fonte
Dependendo do programa usado para o ssh, a maneira de obter a chave correta pode variar. O Putty (popular no Windows) usa seu próprio formato para chaves ssh. Com a maioria das variantes de Linux e BSD que eu já vi, é só procurar
~/.ssh/known_hosts
. Eu normalmente ssh de uma máquina Linux e copio esse arquivo para uma máquina Windows. Então eu uso algo semelhante aSupondo que eu coloquei o arquivo na
C:\Users\cabbott
minha máquina Windows. Se você não tem acesso a uma máquina Linux, tente http://www.cygwin.com/Talvez alguém possa sugerir outra alternativa do Windows. Acho a maneira do putty de manipular chaves SSH armazenando-as no registro em um formato não-padrão, incômodo de extrair.
fonte
cygwin
(você precisa fazer o download doopenssl
pacote e das dependências), consegui fazer o download~/.ssh/known_hosts
. Graças a @CharityAbbott.Forneça a chave rsa pública do host: -
fonte
Você também pode simplesmente fazer
Não é seguro e é uma solução alternativa não adequada para o ambiente ativo, pois desativará a verificação de chaves de host conhecidas globalmente.
fonte
Você também pode executar o seguinte código. É testado e funcionando.
Substitua os valores apropriados.
fonte
Basta substituir "user", "pass", "SSHD_IP". E crie um arquivo chamado known_hosts.txt com o conteúdo do servidor ~ / .ssh / known_hosts. Você receberá uma concha.
fonte
config.put("StrictHostKeyChecking", "no");
Um manual dessh -v
ligação revela o.ssh/known_hosts
arquivo contém a chave (ecdsa-sha2-nistp256
), mas o código faz isso: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)
A configuração do host conhecido é melhor do que a definição do valor da impressão digital.
Ao definir o host conhecido, tente ssh manualmente (primeira vez, antes da execução do aplicativo) na caixa em que o aplicativo é executado.
fonte
Perdi muito tempo com esse problema estúpido e acho que a mensagem está certa: "não há o host no arquivo que estou acessando", mas você pode ter mais do que um arquivo know_host no seu sistema (por exemplo, i estou usando o mobaXterm e ele se mantém dentro do diretório de instalação que monta a casa a partir dessa raiz).
Se você estiver enfrentando: ele está trabalhando na linha de comando, mas não no aplicativo, tente acessar o servidor remoto com ssh e verifique com a opção -v verbose qual arquivo está sendo usado atualmente no exemplo a seguir:
como você pode ver, a chave foi encontrada em:
e não na casa do meu Windows em C: \ Users \ my_local_user \ .ssh, simplesmente os mesclei e alinhei para resolver o problema.
Espero que isso ajude alguém no futuro
fonte
Essa entrada stackoverflow é sobre a verificação de chave do host e não há relação com a autenticação de chave pública.
Quanto à autenticação de chave pública, tente o seguinte exemplo com sua chave privada simples (não codificada),
fonte
fonte