Конечно, Go может загрузить частные ключи x509, но нет функции «делай, что я хочу», такой как openssl_pkey_get_private.
После PEM-декодирования ключа (и, возможно, дешифрования), используйтеодна из функций Parse * PrivateKey в пакете x509 :
package main
import (
"crypto"
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
"log"
"strings"
)
func main() {
pemBytes, err := ioutil.ReadFile("sample.key.pem")
check(err)
block := firstPrivateKey(pemBytes)
if block == nil {
log.Fatal("No private key in input")
}
derBytes := block.Bytes
if x509.IsEncryptedPEMBlock(block) {
derBytes, err = x509.DecryptPEMBlock(block, []byte("password"))
check(err)
}
var key crypto.PrivateKey
switch block.Type {
case "RSA PRIVATE KEY":
key, err = x509.ParsePKCS1PrivateKey(derBytes) // or PKCS8
check(err)
case "EC PRIVATE KEY":
key, err = x509.ParseECPrivateKey(derBytes)
check(err)
default:
log.Fatal("Unsupported key type")
}
fmt.Println(key)
}
func firstPrivateKey(pemBytes []byte) *pem.Block {
var block *pem.Block
for len(pemBytes) > 0 {
block, pemBytes = pem.Decode(pemBytes)
if strings.HasSuffix(block.Type, " PRIVATE KEY") {
return block
}
}
return nil
}
func check(err error) {
if err != nil {
log.Fatal(err)
}
}