Есть ли эквивалент в PHP openssl_pkey_get_private в Golang? - PullRequest
0 голосов
/ 22 мая 2018

Мне нужно перевести PHP-код на Голанг, и я решил эту проблему.

1 Ответ

0 голосов
/ 22 мая 2018

Конечно, 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...