Пакет x509 Go - ParsePKIXPublicKey для DER или PEM? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь получить объект rsa.PublicKey, и я сделал эти шаги:

 ----BEGIN RSA PUBLIC KEY----
           ....
 ----END RSA PUBLIC KEY----
package main

import (
   "crypto/rand"
   "crypto/rsa"
   "crypto/x509"
   "encoding/pem"
   "fmt"
   "io/ioutil"
)

func main() {

 key, err := ioutil.ReadFile("./new_public.pem")
 if err != nil {
    fmt.Println(err.Error())
 }

 block, _ := pem.Decode([]byte(key))
 if block == nil {
    fmt.Println("unable to decode publicKey to request")
 }

 pub, err := x509.ParsePKIXPublicKey(block.Bytes)
 if err != nil {
     panic("failed to parse RSA encoded  public key" + err.Error())
 }

 switch pub := pub.(type) {
 case *rsa.PublicKey:
     fmt.Println("pub is of type RSA:", pub)
 default:
     panic("error")
 }

}

После этого, когда я пытаюсь x509.ParsePKIXPublicKey(block.Bytes)Я получаю сообщение об ошибке:

panic: failed to parse RSA encoded  public keyasn1: 
structure error: tags don't match (16 vs {class:0 tag:2 length:129 isCompound:false}) 
{
 optional:false 
 explicit:false 
 application:false 
 private:false 
 defaultValue:<nil> tag:<nil> 
 stringType:0 
 timeType:0 
 set:false 
 omitEmpty:false
} AlgorithmIdentifier @3

Итак, я прочитал некоторые блоги и документацию о форматах DER и PEM, и это разные способы кодирования сертификата, в основном одно использование base64, а другое - просто байты.

В пакете x509 Golang x509.ParsePKIXPublicKey говорит:

ParsePKIXPublicKey parses a DER-encoded public key. These values are typically found in PEM blocks with "BEGIN PUBLIC KEY"

И в примере этой функции используйте pem.Decode ().Я очень смущен этим, потому что для этого нужно использовать pem.Decode или что-то вроде der.Decode()?

Кроме того, в чем реальная разница между x509.ParsePKCS1PublicKey() и x509.ParsePKIXPublicKey()?Оба делают одну и ту же работу, чтобы получить rsa.PublicKey?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Проблема здесь заключается в понимании разницы между x509.ParsePKCS1PublicKey (PKCS # 1) и x509.ParsePKIXPublicKey (PKCS # 8).

Обычно, когда заголовок PEM имеет тип RSA PUBLIC KEY, этоссылаясь на открытый ключ RSA в кодировке PKCS # 1, который определен в RFC 8017 (PKCS # 1) как:

RSAPublicKey ::= SEQUENCE {
     modulus           INTEGER,  -- n
     publicExponent    INTEGER   -- e
 }

Вы фактически не предоставили тело своего открытогоключ (это было бы безопасно), но вполне справедливо предположить, что если при декодировании ключа с использованием x509.ParsePKIXPublicKey произошел сбой, ваш ключ, скорее всего, в указанном выше формате (x509.ParsePKIXPublicKey использует кодировку PKCS # 8).

В этом случае вы сможете получить rsa.PublicKey из файла, используя следующий код (не забудьте добавить обработку ошибок):

rawPem, _ := ioutil.ReadFile("./public.key")
pemBlock, _ := pem.Decode(rawPem)
publicKey, _ := x509.ParsePKCS1PublicKey(pemBlock.Bytes)

Если этоне решит вашу проблему, попробуйте вставить ключ, который у вас есть, в этот сайт , чтобы увидеть, какую структуру ASN.1 он использует.Для справки ключ, который я использовал для проверки этого, включен здесь:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApW1W9dnfdFF7FHrq6HPveR/9T+nM70yO7QOGytR0j/chMBJcJBjG
hJOuKPFbkVyS+BE/4M8CojLgvz4ex82Re0sFa5TqnoWvuP5P4vktR6M5W53sTW3y
gUnfF/oHcEmARQ1xKZdgVnlIfrdbpjecPyLi1Ng4HmhEfCFUOW64koxpb4XeH5O5
q+vc/731ExVOYBU8Sl6kPdjpJuVjS3DHKAVgfVEhscXd3JDjDuMDT3w1IYNb5c2s
wHE55q4Jnc1cr42jdynnkXzmuOGo2C6yD95kbBDLp7wSiBxaMA8gbRkzWJ99T+6l
KsKG2zfndMF3jZW1v1wWiEbYRN07qbN0NQIDAQAB
-----END RSA PUBLIC KEY-----

ASN.1 Structure of reference RSA Public Key

0 голосов
/ 19 февраля 2019

Вот, пожалуйста.

https://golang.org/src/crypto/tls/generate_cert.go

Вы должны сгенерировать сертификаты, используя код выше.

Например:

. / Generate_cert --host = "source: destination" -rsa-bits 1024

openssl pkcs8 -topk8 -nocrypt -in key.pem -out privatekey.pcks8

openssl x509 -pubkey -noout -in cert.pem> publickey.pem

Это должно решить проблему для вас и предоставить вам необходимые файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...