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



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

最后,我根据其中一篇文章尝试了以下方法。第一次使用StrictHostKeyChecking作为no获得 session 。完成后,将结果保存到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

最佳答案


您似乎认为主机密钥与用于身份验证的密钥对有关,而与之无关。这些完全无关。主机密钥是服务器的密钥,它们是固定的,服务器的所有用户在安装服务器时会生成相同的密钥。
有关详细信息,请参见我的文章Understanding SSH key pairs
我相信,一旦您意识到这一点,并回到所有有关UnknownHostKey的现有问题,现在对您来说更有意义:

  • How to resolve Java UnknownHostKey, while using JSch SFTP library?
  • com.jcraft.jsch.JSchException: UnknownHostKey


  • 这不是一个完美的解决方案,但可以接受。
    为了获得完美的解决方案,请在Windows SSH服务器上找出本地指纹,并配置AWS Java代码以使其预先生效。

    no根本不安全。 accept-new和上面的解决方案一样好。但是JSch仍然不支持accept-new
    (实施起来并不难)

    09-27 03:12