【发布时间】:2015-10-23 11:33:24
【问题描述】:
我正在尝试在我的程序中加载一个 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。 有什么想法吗?
P.S:我找不到任何通过 Internet 加载 DSA 私钥 pem 文件的示例。
【问题讨论】:
-
只是一个旁注:你应该选择较短的变量名或将它们写在驼峰式中,因为
recoveredpemdsaparameteres不仅难以阅读,而且在仔细检查后也不正确。 -
恐慌是因为
recoveredprivateKey为零。在尝试 Unmarshal 之前分配结构。 -
@JimB 是的,但它并没有解决问题,因为我因结构不匹配而再次恐慌。看看我的回答......如果它开箱即用,我会非常高兴!
-
@mrd0ll4r 同意。我考虑了您的提示并相应地重写了该功能。希望它现在更具可读性。
标签: go openssl digital-signature