尝试从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?
最后,对于生产环境,StrictHostKeyChecking
,accept-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
答案 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代码以使其预先生效。
最后,对于生产环境,
no
,session.setConfig("StrictHostKeyChecking", "no")
而不是StrictHostKeyChecking
是更安全和建议的操作吗?
accept-new
根本不安全。 no
与上述解决方案一样好。但是JSch仍然不支持no
。
(实现起来并不难)