我正在尝试在我的程序中加载一个 dsa 私钥,这是我的方法:
我使用 openssl 创建了一个 dsa 密钥对:
openssl dsaparam -genkey 2048 -out dsakey.pem
我使用以下函数来解析 pem 文件
func getDSAPrivateKeyFromPemFile(pemfilepath string) (recoveredprivateKey *dsa.PrivateKey, err error) {
pemfile, err := os.Open(pemfilepath)
if err != nil {
return nil, err
}
recoveredbytes, err := ioutil.ReadAll(pemfile)
if err != nil {
return nil, err
}
recoveredpemdsaparameteres, rest := pem.Decode(recoveredbytes)
if recoveredpemdsaparameteres == nil {
return nil, errors.New("No pem recovered")
}
_, err = asn1.Unmarshal(append(recoveredpemdsaparameteres.Bytes, recoveredpemdsaprivatekey.Bytes...), recoveredprivateKey)
if err != nil {
return nil, err
}
fmt.Printf("PEM:%v\n", recoveredpemdsaparameteres)
recoveredpemdsaprivatekey, _ := pem.Decode(rest)
fmt.Printf("PEM:%v\n", recoveredpemdsaprivatekey)
pemfile.Close()
}
当我调用这个函数失败时:
panic: reflect: call of reflect.Value.Type on zero Value
goroutine 1 [running]:
reflect.Value.Type(0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/reflect/value.go:1664 +0x7b
encoding/asn1.parseField(0x0, 0x0, 0x0, 0xc8200b0600, 0x58b, 0x600, 0x0, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/encoding/asn1/asn1.go:558 +0xbd
encoding/asn1.UnmarshalWithParams(0xc8200b0600, 0x58b, 0x600, 0x1383e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/encoding/asn1/asn1.go:957 +0x16e
encoding/asn1.Unmarshal(0xc8200b0600, 0x58b, 0x600, 0x1383e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/encoding/asn1/asn1.go:950 +0x8f
main.getDSAPrivateKeyFromPemFile(0x1e7fa0, 0x26, 0x0, 0x0, 0x0)
但是,我可以在输出中完美地看到我的 dsa 密钥:
PEM:&{DSA PARAMETERS map[] [48 130 2 45 2 130...]}
PEM:&{DSA PRIVATE KEY map[] [48 130 3 86 2 1 0 ...]}
问题实际上是如何将 pem 字节解组到 dsa.PrivateKey。有任何想法吗?
PS:我找不到任何通过 Internet 加载 DSA 私钥 pem 文件的示例。
ITMISS
相关分类