go - 主机 key 不匹配

标签 go ssh ssh-keys

我正在尝试使用 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/

相关文章:

go - 如何在多个源文件中解析导入语句?

go - 定义函数接收器还是在参数中传递结构指针?

bash - ssh在后台运行脚本并获取其pid

mysql-workbench - 由于 key ,MySQL Workbench 无法通过 SSH 连接

连接到 Amazon EC2 实例时 SSH 挂起

go - 从核心函数获取未知类型的nil值

java - Go SHA-256 哈希不同于 Java SHA-256 哈希

c# - 如何连接需要SSH的远程Mysql服务器?

linux - Jenkins slave 设置 - master 和 slave 节点都是 Linux 机器

ssh - 如何在Putty中通过SSH连接?