有关com.jcraft.jsch.JSchException的查询:UnknownHostKey:x.y.com。 DSA密钥指纹为“ ac:ew:....”

时间:2019-03-06 23:40:31

标签: java windows amazon-web-services ssh jsch

尝试从AWS集群连接到Windows服务器之一时,出现以下错误。

  

原因:com.jcraft.jsch.JSchException:UnknownHostKey:x.y.com。 DSA密钥指纹为“ ac:ew:.....

注意: :我使用PuTTYgen生成了RSA密钥,但是每次尝试连接时都会产生DSA指纹问题。我提到了多个SO链接,但无法获得正确的解决方案。

最后,我根据其中一篇文章尝试了以下方法。第一次使用StrictHostKeyChecking作为no获得会话。完成后,将结果保存到AWS服务器上的已知主机文件中,以便下次尝试连接到Windows服务器时就知道它正在连接到正确的服务器。

session.setConfig("StrictHostKeyChecking", "no")
session.setConfig("PreferredAuthentications", "publickey,password")
session.connect(5000)
LOG.info("session connected...." + session.isConnected())
val arrayHostKey = jsch.getHostKeyRepository().getHostKey
  for (i <- 0 to arrayHostKey.size - 1) {
      println(arrayHostKey(i).getHost)
      println(arrayHostKey(i).getKey)
      println(arrayHostKey(i).getType)
      if (arrayHostKey(i).getHost.equalsIgnoreCase(host))
         session.setConfig("server_host_type", arrayHostKey(i).getType)
LOG.info("sftp session connected without using proxy..." + session.isConnected())

这可行,但我认为我没有建立session.setConfig("StrictHostKeyChecking", "no")的全部原因可能是可行的。实现此目标的正确方法是什么?

第二点,我不确定是如何强制服务器仅要求RSA密钥而不是DSA?

最后,对于生产环境,StrictHostKeyCheckingaccept-new而不是no是更安全和建议的操作吗?

这些是我正在查看的JSch日志。

SSH_MSG_KEXINIT sent
SSH_MSG_KEXINIT received
kex: server: diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
kex: server: ssh-dss
kex: client: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
kex: server->client aes128-ctr hmac-md5 none
kex: client->server aes128-ctr hmac-md5 none
SSH_MSG_KEXDH_INIT sent
expecting SSH_MSG_KEXDH_REPLY
ssh_dss_verify: signature true
Disconnecting from x.y.com port 22

1 个答案:

答案 0 :(得分:2)

  

我使用PuTTYgen生成了RSA密钥,但是每次尝试连接时都会产生DSA指纹问题。

您似乎认为主机密钥与用于身份验证的密钥对有关-事实并非如此。这些完全无关。主机密钥是服务器的密钥,它们是固定的,服务器的所有用户在安装服务器时会生成相同的密钥。

有关详细信息,请参见我的文章Understanding SSH key pairs

我相信,一旦您意识到这一点,并回到所有有关HomeController的问题,现在对您来说更有意义:


  

最后,我根据其中一篇文章尝试了以下方法。第一次使用<body> <div> <h1>Dashboard</h1> <h3>Username : @Session["userName"].ToString()</h3> <h3>User ID : @Session["userID"].ToString()</h3> <a href="@Url.Action("LogOut","Login")">Logout</a> </div> </body>作为UnknownHostKey获得会话。完成后,将结果保存到AWS服务器上的已知主机文件中,以便下次尝试连接到Windows服务器时就知道它正在连接到正确的服务器。

     

这可行,但我认为我没有建立StrictHostKeyChecking的全部原因可能是可行的。实现此目标的正确方法是什么?

这不是一个完美的解决方案,但是可以接受的。

要获得完美的解决方案,请在Windows SSH服务器上本地找出指纹,并配置AWS Java代码以使其预先生效。


  

最后,对于生产环境,nosession.setConfig("StrictHostKeyChecking", "no")而不是StrictHostKeyChecking是更安全和建议的操作吗?

accept-new根本不安全。 no与上述解决方案一样好。但是JSch仍然不支持no

(实现起来并不难)