使用SSH密钥不能与crypto / ssh一起使用,但可以手动执行

时间:2017-11-20 23:22:54

标签: 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.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!")
}

1 个答案:

答案 0 :(得分:2)

经过漫长的组件隔离过程后,我终于能够验证为什么我的密钥对没有进行身份验证。这是因为我正在使用的自定义connivence包正在略微关闭公钥。

我发布了一个未解决的问题:

https://github.com/ianmcmahon/encoding_ssh/issues/1

简而言之:

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

  

ssh-rsa AAAAB3NzaC1yc2EAAAA EAAEAAQAAAg C2u3I / nbN9jcWDV ..

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

  

ssh-rsa AAAAB3NzaC1yc2EAAAA DAQABAAACAQ C2u3I / nbN9jcWDV ...

注意粗体位略有不同。这会导致SSH身份验证无效。