Go SSH密钥不存在';无法使用crypto/ssh,但可以手动使用

Go SSH密钥不存在';无法使用crypto/ssh,但可以手动使用,go,ssh-keys,Go,Ssh Keys,我用crypto/SSH包生成了一个SSH-RSA密钥对。然而,当我试图通过Go中的脚本使用它时,我得到了错误: 无法连接:ssh:握手失败:ssh:无法进行身份验证, 尝试的方法[none publickey],未保留支持的方法 当我通过CLI连接到远程设备时,它会成功连接: ssh -i ~/.ssh/test_key_1 username@172.22.4.1 我可能使用的软件包不正确吗 注意:私钥没有密码短语。 package main import ( "golang.or

我用
crypto/SSH
包生成了一个SSH-RSA密钥对。然而,当我试图通过Go中的脚本使用它时,我得到了错误:

无法连接:ssh:握手失败:ssh:无法进行身份验证, 尝试的方法[none publickey],未保留支持的方法

当我通过CLI连接到远程设备时,它会成功连接:

ssh -i ~/.ssh/test_key_1 username@172.22.4.1
我可能使用的软件包不正确吗

注意:私钥没有密码短语。

package main

import (
    "golang.org/x/crypto/ssh"
    "io/ioutil"
    "log"
)

func main() {
    privateKeyFile := "/Users/username/.ssh/test_key_1"
    remoteIP := "172.22.4.1:22"
    user := "username"

    privateKeyBytes, err := ioutil.ReadFile(privateKeyFile)
    if err != nil {
        log.Fatal(err)
    }

    key, err := ssh.ParsePrivateKey(privateKeyBytes)
    if err != nil {
        log.Fatal(err)
    }

    config := &ssh.ClientConfig{
        User: user,
        Auth: []ssh.AuthMethod{
            // Use the PublicKeys method for remote authentication.
            ssh.PublicKeys(key),
        },
        // using InsecureIgnoreHostKey() for testing purposes
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }

    client, err := ssh.Dial("tcp", remoteIP, config)
    if err != nil {
        log.Fatalf("unable to connect: %v", err)
    }
    defer client.Close()

    fmt.Println("Success!")
}

经过漫长的组件隔离过程后,我终于能够验证为什么我的密钥对没有进行身份验证。这是由于我使用的自定义connivence包生成的公钥稍有偏差

我发表了一篇关于他公开发表的文章:

简言之:

使用
EncodePublicKey()
函数创建的公钥如下所示:(为简洁起见截断)

ssh rsa aaaab3nzac1yc2eaaaeaaeaaqaagC2u3I/nbN9jcWDV

但是,当运行
ssh keygen-y-f id_rsa
时,会创建以下内容:

ssh rsa aaaab3nzac1yc2eaaDAQABAAACAQC2u3I/nbN9jcWDV


请注意粗体的位是如何略有不同的。这会导致SSH身份验证不起作用。

您确定SSH客户端实际上正在使用该密钥连接吗?客户端仍将提供所有其他已知密钥,因此您需要连接
-v
,并验证提供并接受了哪个密钥。@JimB主意不错。你可能在这里发现了什么。使用
-v
选项,我看到
debug1:提供RSA公钥:另一个密钥名称
。因此,它似乎为它提供了另一把钥匙。仍然不明白为什么我生成的密钥对不起作用。公钥和私钥似乎都已正确格式化,公钥肯定位于远程计算机上的授权密钥中,公钥与ssh-keygen-y-f test_-key_1的输出相匹配以确认,我运行了
ssh add-D
来清除ssh代理,手动连接不再工作。您可能需要服务器上的调试日志来找出它不被接受的原因。我还对如何使用crypto/ssh包生成密钥对很感兴趣,因为该包没有生成密钥的帮助程序或代码。