我正在使用Golang开发API,并且具有以下JSON文件keys.json
:
{
"publicKeys": {
"Flex": "<valid pgp public key>",
"Flex2": "<valid pgp public key>"
},
"privateKey": "<valid pgp private key>"
}
要解组,我有以下模型
type PGPKeys struct {
PublicKeys map[string]string `json:"publicKeys"`
PrivateKey string `json:"privateKey"`
}
然后我使用
解组代码keysJSONFile, err := os.Open(keysPath)
if keysJSONFile != nil {
defer keysJSONFile.Close()
}
if err != nil {
return nil, err
}
keysJSONBytes, err := ioutil.ReadAll(keysJSONFile)
if err != nil {
return nil, err
}
var pgpKeys PGPKeys
err = json.Unmarshal(keysJSONBytes, &pgpKeys)
if err != nil {
return nil, err
}
后来,当我使用openpgp
获取公钥包时,遇到EOF
错误,armor.Decode
在找不到任何块时返回,但我不确定为什么会发生
func GetPublicKeyPacket(publicKey []byte) (*packet.PublicKey, error) {
publicKeyReader := bytes.NewReader(publicKey)
block, err := armor.Decode(publicKeyReader)
if err != nil {
return nil, err
}
if block.Type != openpgp.PublicKeyType {
return nil, errors.New("Invalid public key data")
}
packetReader := packet.NewReader(block.Body)
pkt, err := packetReader.Next()
if err != nil {
return nil, err
}
key, ok := pkt.(*packet.PublicKey)
if !ok {
return nil, err
}
return key, nil
}
注意::当我调用该函数时,我确实使用类似
的类型进行了转换publicKeyPacket, err := pgp.GetPublicKeyPacket([]byte(h.PGPKeys.PublicKeys[h.Config.PGPIdentifier]))
最后,我尝试将密钥移动到单独的TXT文件中,并且可以使用,但是由于某些原因,将它们包含在JSON中却不能
答案 0 :(得分:0)
我在随机尝试一些东西时找到了解决方案,我和您(未来的答案阅读器)一样感到惊讶。如果有人可以提供解释,我将很感激。
我通过将所有换行符替换为“ \ n”来将密钥存储在JSON中,以便将其存储在一行中。您知道PGP密钥在-----BEGIN PGP PUBLIC KEY BLOCK-----
之后如何有一个空行吗?好吧,在我的文件中,我有类似
"publicKeys": {
"Flex": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nQfdsf...."
}
添加多余的空行,即将其更改为
"publicKeys": {
"Flex": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nQfdsf...."
}
编辑:如评论中的@Adrian所述,这是因为如果根据RFC规范不再存在该行,则它是无效的PGP密钥。这应该是这样。