簡體   English   中英

從PEM文件加載(生成的OpenSSL)DSA私鑰

[英]Load (openssl generated) DSA private key from PEM file

我正在嘗試在程序中加載dsa私鑰,這是我的處理方式:

  1. 我使用openssl創建一個dsa密鑰對:

     openssl dsaparam -genkey 2048 -out dsakey.pem 
  2. 我使用以下功能來解析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:我找不到通過互聯網加載DSA私鑰pem文件的任何示例。

花了幾個小時后,我設法解決了我發布的調查結果的問題,這樣可以節省某人的時間:

首先,我使用以下出色的在線工具查看了我的pem文件編碼: http : //lapo.it/asn1js/ 直到那時我才意識到go期望pem文件具有不同的結構...不好! 以后,將文件中的每個值與相應的dsa.PrivateKey結構相關聯並不難。 因此,我創建了一個新結構,並將其命名為MyPrivateKey,其順序與pem文件相同:

type MyPrivateKey struct {
    E1, P, Q, G, Y, X *big.Int
}

然后,我沒有嘗試直接將其解組到dsa.PrivateKey,而是將asn1編碼值解組到了自己的結構中。 神奇地,它起作用了。 這是修改后的func:

func getDSAPrivateKeyFromPemFile(pemFilePath string) (privateKey *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
    }
    pemfile.Close()

    pemDSAParameters, rest := pem.Decode(recoveredBytes)
    if pemDSAParameters == nil {
        return nil, errors.New("No pem recovered")
    }
    pemDSAPrivateKey, _ := pem.Decode(rest)
    keyParameters := dsa.Parameters{G: big.NewInt(0), P: big.NewInt(0), Q: big.NewInt(0)}
    _, err = asn1.Unmarshal(pemDSAParameters.Bytes, &keyParameters)
    if err != nil {
        return nil, err
    }
    //fmt.Printf("\n\n\n\n\n\nP:%x\n\nG:%x\n\nQ:%x\n\n\n\n\n\n", keyParameters.P, keyParameters.G, keyParameters.Q)
    myPrivateKey := MyPrivateKey{}
    _, err = asn1.Unmarshal(pemDSAPrivateKey.Bytes, &myPrivateKey)
    if err != nil {
        return nil, err
    }
    //fmt.Printf("\nprivate\nE1:%x\n\nP:%x\n\nQ:%x\n\nG:%x\n\nY:%x\nX:%x\n\n\n\n", myPrivateKey.E1, myPrivateKey.P, myPrivateKey.Q, myPrivateKey.G, myPrivateKey.Y, myPrivateKey.X)
    privateKey = &dsa.PrivateKey{}
    privateKey.Parameters = keyParameters
    privateKey.X = myPrivateKey.X

    return privateKey, nil
}

也許有比這更簡單的方法,而我只是忽略了! 如果您知道更好的方法,請成為我的客人! 否則,我認為go應該在標准庫中處理此類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM