【问题标题】:Getting ssh: short read error when trying to parse a public key in golang获取 ssh:尝试在 golang 中解析公钥时出现短读错误
【发布时间】:2020-09-25 21:44:17
【问题描述】:

我正在尝试使用gossh lib 解析公钥,如下所示:

var testPublicKey = `ssh-rsa AAAAB3NzaC1yc...DEdfU= pkaramol@MacBookPro`


pubKey, err := ssh.ParsePublicKey(([]byte(testPublicKey)))
if err != nil {
  log.Fatal(err)
}

但我收到以下错误:

ssh: short read

我知道this 的问题,但它解决了另一个问题(从文件中读取公钥并加载到授权密钥列表)

我的目标是最终得到一个*rsa.PublicKey type 用于this 函数。

【问题讨论】:

  • 我不确定这是一个不同的问题。听起来这个函数并没有决定读取存储在磁盘上的格式。

标签: go ssh


【解决方案1】:

密钥的有线格式和磁盘格式之间存在差异。来自文档:

ParsePublicKey 根据 RFC 4253 解析格式化用于 SSH 有线协议的 SSH 公钥

因此您需要将其编组为有线格式。

package main

import (
    "log"

    "golang.org/x/crypto/ssh"
)

func parse(in []byte) error {
    // ParseAuthorizedKeys parses a public key from an authorized_keys file used in OpenSSH
    pk, _, _, _, err := ssh.ParseAuthorizedKey(in)
    if err != nil {
        return err
    }
    // pk.Marshal() Marshal returns the serialized key data in SSH wire format, with the name prefix
    // ssh.ParsePublicKey is used to unmarshal the returned data
    res, err := ssh.ParsePublicKey(pk.Marshal())
    if err != nil {
        return err
    }
    log.Println(res)
    return nil

}

func main() {
    key := "ssh-rsa AAAAB3NzaC1yc...DEdfU= pkaramol@MacBookPro"
    if err := parse([]byte(key)); err != nil {
        log.Println(err)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2022-01-04
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多