JSON 编码/解码和 RSA 证书



使用 Go 的内置 JSON 编码和 RSA 证书,将 RSA 证书编码为 JSON,然后再次解码失败。 谁能告诉我为什么?

示例代码:

package main
import (
"math/big"
"bytes"
"crypto/rsa"
"crypto/x509"
"encoding/json"
"fmt"
)
func main() {
x := x509.Certificate{}
N := big.Int{}
N.SetString("22748727785943691703458259255009028279491017474470365445444638136335844588257736864763884308763893296520197853772438093808627310216929382637891614145169115712146316592081285259872752696564531634381437767246277672628285238806746417464073995314135364153811760424176263991818395775316575483628262670505480241278789196525640591586277923027755459881178666634831466031143685993230414451164180917857690755309066589767418739391025091379117132119476119702352443067398453637494721792111385747721853079909232828234315851102595340792201691113238210441101837352511126798300795766862744529103670862211990583319260851455953450220537", 10)
x.PublicKey = &rsa.PublicKey{N:&N, E:65537}
var y x509.Certificate
b := bytes.Buffer{}
err := json.NewEncoder(&b).Encode(x)
if err != nil { fmt.Println(err); return; }
err = json.NewDecoder(&b).Decode(&y)
if err != nil { fmt.Println(err) }
}

这在Decode步骤中失败,并显示:

json: cannot unmarshal number 22748727785943691703458259255009028279491017474470365445444638136335844588257736864763884308763893296520197853772438093808627310216929382637891614145169115712146316592081285259872752696564531634381437767246277672628285238806746417464073995314135364153811760424176263991818395775316575483628262670505480241278789196525640591586277923027755459881178666634831466031143685993230414451164180917857690755309066589767418739391025091379117132119476119702352443067398453637494721792111385747721853079909232828234315851102595340792201691113238210441101837352511126798300795766862744529103670862211990583319260851455953450220537 into Go struct field Certificate.PublicKey of type float64

游乐场示例

这里的问题是Certificate类型声明PublicKeyinterface{},因此JSON解组器没有提示它应该将公钥解组成什么类型。 它试图猜测并弄错了;即使大整数被正确地解编成一个math/big.Int对象,PublicKey字段仍然是一个map[string]interface{},而不是一个crypto/rsa.PublicKey的对象,所以几乎肯定不是你想要的。

要完成这项工作,您需要编写一个自定义的JSON编组器/解组器;可能将整个证书编码为PEM文本是将其存储在JSON输出中的正确方法。 就我而言,我可以完全不将证书编码为 JSON。

最新更新