我必须将PHP代码翻译成Golang,我遇到了这个问题。
答案 0 :(得分:1)
当然Go可以加载x509私钥,但是没有“do-what-what-want”功能,例如openssl_pkey_get_private。
在PEM解码密钥(并可能对其进行解密)之后,使用x509 package中的一个Parse * PrivateKey函数:
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)
}
}