我正在尝试使用 Go 连接到远程服务器。这就是我正在使用的:( SSH Handshake complains about missing host key )
key, err := ioutil.ReadFile("/Users/pankaj/.ssh/id_rsa")
if err != nil {
log.Fatalf("unable to read private key: %v", err)
}
// Create the Signer for this private key.
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
log.Fatalf("unable to parse private key: %v", err)
}
hostKeyCallback, err := knownhosts.New("/Users/pankaj/.ssh/known_hosts")
if err != nil {
log.Fatal(err)
}
sshConfig := &ssh.ClientConfig{
User: "pankaj",
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
HostKeyCallback: hostKeyCallback,
}
conn, err := ssh.Dial("tcp", "dev.letsreap.com:22", sshConfig)
if err != nil {
log.Fatalf("unable to connect: %v", err)
}
但是在 ssh.Dial 上我得到:
ssh: handshake failed: knownhosts: key mismatch
我已经验证可以从命令行连接到远程服务器。如果我使用 ssh.InsecureIgnoreHostKey(),我也可以成功连接。我错过了什么?
最佳答案
对于那些面临同样问题的人来说,默认情况下,ecdsa-sha2-nistp256
似乎被用作主机 key 算法,至少我在我的案例中遇到过这种情况。
您可以在 HostKeyAlgorithms
字段中指定主机 key 算法,如下所示:
conf := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
HostKeyCallback: hostKeyCallback,
HostKeyAlgorithms: []string{ssh.KeyAlgoED25519},
}
并确保在 known_hosts
文件中使用 ED25519
类型的公钥。
关于go - 主机 key 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55487627/