加密/SSH ParsePublicKey“short read”错误

8
在我正在开发的程序中,我需要一种方法在开发过程中将公钥添加到authorized_keys文件中,因此我使用命令行参数来实现。我省略了大部分代码,但如果您想查看所有代码,这里是存储库,问题行位于main.go的第20行。
b, err := ioutil.ReadFile(os.Args[1])
if err != nil {
    log.Fatalf("Fatal error trying to read new public key file: %s", err)
}

newAuthorizedKey, err := ssh.ParsePublicKey(b)
if err != nil {
    log.Fatalf("Fatal error trying to parse new public key: %s", err)
}

"short read" 错误来自于`ssh.ParsePublicKey`函数。我传入的命令行参数是需要添加到这个程序的authorized_keys文件中的公钥的位置(例如`~/.ssh/id_rsa.pub`)。我已经确保该文件被正确传递到程序中。
我研究了源代码,希望调试这个"short read"错误,但是我无法理解发生了什么。 `crypto/ssh` 中 `ParsePublicKey` 函数的源代码位置在这里,而`ParsePublicKey`函数使用的`parseString`函数生成了"short read"错误,它的源代码位置在这里,也在`crypto/ssh`中。

1
ParsePublicKey 的文档说明它解析的是以线格式存储的公钥,而不是 openssh 使用的磁盘格式。 - JimB
不知道有多种格式,是否有一种方法可以转换为线格式?@JimB - George Edward Shaw IV
1
您不需要解析任何内容,id_rsa.pub就是authorized_keys格式。大多数人只需将其直接附加到authorized_keys文件中即可在cli上添加它们。 - JimB
我尝试将其转换为ssh.PublicKey接口的原因是因为MarshalAuthorizedKey接受一个ssh.PublicKey接口并返回一个准备附加到authorized_keys文件的授权密钥。他们只有这个函数是为了将密钥恢复为磁盘上的格式吗?@JimB - George Edward Shaw IV
1
不,它们提供该功能是为了在您没有 .pub 文件时使用。 - JimB
好的,谢谢你的帮助 @JimB - George Edward Shaw IV
1个回答

12

我认为有些评论已经提到了这一点,但是函数ssh.ParseAuthorizedKey([]byte)可以解读位于~/.ssh/id_rsa.pub的文件。

https://godoc.org/golang.org/x/crypto/ssh#ParseAuthorizedKey

您的示例应该按照以下方式工作:

b, err := ioutil.ReadFile(os.Args[1])
if err != nil {
    log.Fatalf("Fatal error trying to read new public key file: %s", err)
}

newAuthorizedKey, _, _, _, err := ssh.ParseAuthorizedKey(b)
if err != nil {
    log.Fatalf("Fatal error trying to parse new public key: %s", err)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接