Я пытаюсь загрузить АСС закрытый ключ в моей программе, Вот как я подошел к нему:нагрузки (OpenSSL генерироваться) DSA закрытый ключ из файла PEM
создать пару ключей DSA с помощью OpenSSL :
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: Я не смог найти какой-либо пример загрузки файла приватного ключа DSA через Интернет.
только сторона примечания: вы должны либо выбрать более короткие имена переменных, либо использовать их в camelCase, так как «recoveredpemdsaparameteres» не только трудно читать, но и после тщательного осмотра неверно. – mrd0ll4r
Паника - это потому, что 'recoveredprivateKey' равен нулю. Выделите структуру, прежде чем пытаться ее развязать. – JimB
@JimB да, но это не решило проблему, поскольку у меня была другая паника из-за несоответствия структуры. См. Мой ответ ... Я был бы более чем счастлив, если он будет работать из коробки! –