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包生成密钥对很感兴趣,因为该包没有生成密钥的帮助程序或代码。