从 JSON Golang 读取 PGP 密钥时出现 EOF 错误

EOF error while reading PGP keys from JSON Golang

我正在使用 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获取public密钥包时,遇到EOF错误,armor.Decode returns无法获取找到任何障碍——但我不确定为什么会这样

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 中并不

我在随机尝试时找到了解决这个问题的方法,我和你一样惊讶(未来的答案 reader)。如果有人能提供解释,我将不胜感激。

我通过用“\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 密钥。应该是这样。