在Golang中是否等同于PHP的openssl_pkey_get_private?

时间:2018-05-22 07:28:37

标签: php go

我必须将PHP代码翻译成Golang,我遇到了这个问题。

1 个答案:

答案 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)
    }
}