简体   繁体   English

GO-如何将公钥从字符串转换为PEM格式

[英]GO - How to convert public key from string to PEM format

I am trying to use jwt library to do jwt validation. 我正在尝试使用jwt库进行jwt验证。 And i am getting public key from another application by calling its REST endpoint which is returning public key in string format. 我通过调用其REST端点从另一个应用程序获取公钥,该REST端点以字符串格式返回公钥。

So now when trying to send that public key in same string format, i am getting "Invalid key format". 因此,现在当尝试以相同的字符串格式发送该公共密钥时,我会收到“无效的密钥格式”。 Any help on how to convert string formatted key to a valid PEM format would be great. 如何将字符串格式的密钥转换为有效的PEM格式的任何帮助都将非常有用。

func (test *TESTStrategy) doJWTValidation(token string, key string, logger *util.Logger) (TESTResponse, error) {
    parsedToken, jwtErr := jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
        return decodedJWT.ParsedPubKey, nil
    })

Below is the error what i am getting when passing key as a string to jwt.Pasrse() call. 下面是将键作为字符串传递给jwt.Pasrse()调用时出现的错误。

在此处输入图片说明

Public Key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsFWkb/eSl6I3DRVhaonW3DFy8EnL0yaPiDzCcOLuYfBjN9zZIR1wXmnMJFle1K89qHGg42wgweVTIwA1XFTfoUKSziwsjF6FscZX5H56ZYyS/wWiO3rWWynlfbSZt+ga71+ndsu+A0Dy7Nn7ZgP8kRsu4UM5vE7QQTRERNiUKpzScN1cgZUFUqSddQmkwTEN8hH1mFX1Mum54NGqWIlmQxQDrOyogmMXIaaakhabcmuIPMULVVDVwUJC9sSDsc/j05qcZn3kkiEBRyiYB6ZLY2W7WfiV+dB7/icPONsYSD0FxHWEGNnbqtiGoNf9WZWtaP+o8WMR9sB3GKGVnbLvbQIDAQAB 公钥:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsFWkb / eSl6I3DRVhaonW3DFy8EnL0yaPiDzCcOLuYfBjN9zZIR1wXmnMJFle1K89qHGg42wgweVTIwA1XFTfoUKSziwsjF6FscZX5H56ZYyS / wWiO3rWWynlfbSZt + ga71 + NDSU + A0Dy7Nn7ZgP8kRsu4UM5vE7QQTRERNiUKpzScN1cgZUFUqSddQmkwTEN8hH1mFX1Mum54NGqWIlmQxQDrOyogmMXIaaakhabcmuIPMULVVDVwUJC9sSDsc / j05qcZn3kkiEBRyiYB6ZLY2W7WfiV + DB7 / icPONsYSD0FxHWEGNnbqtiGoNf9WZWtaP + o8WMR9sB3GKGVnbLvbQIDAQAB

That's a PEM encoded key, it's just missing the BEGIN & END headers. 那是一个PEM编码的密钥,只是缺少了BEGIN&END标头。 The key is simple Base64 encoded, you can decode and unmarshal into a RSA key as follows: 该密钥是简单的Base64编码,您可以按以下方式解码和解组为RSA密钥:

base64Data := []byte(`MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsFWkb/eSl6I3DRVhaonW3DFy8EnL0yaPiDzCcOLuYfBjN9zZIR1wXmnMJFle1K89qHGg42wgweVTIwA1XFTfoUKSziwsjF6FscZX5H56ZYyS/wWiO3rWWynlfbSZt+ga71+ndsu+A0Dy7Nn7ZgP8kRsu4UM5vE7QQTRERNiUKpzScN1cgZUFUqSddQmkwTEN8hH1mFX1Mum54NGqWIlmQxQDrOyogmMXIaaakhabcmuIPMULVVDVwUJC9sSDsc/j05qcZn3kkiEBRyiYB6ZLY2W7WfiV+dB7/icPONsYSD0FxHWEGNnbqtiGoNf9WZWtaP+o8WMR9sB3GKGVnbLvbQIDAQAB`)
d := make([]byte, base64.StdEncoding.DecodedLen(len(base64Data)))
n, err := base64.StdEncoding.Decode(d, base64Data)
if err != nil {
    // Handle error
}
d = d[:n]
key,err:=x509.ParsePKIXPublicKey(d)
if err != nil {
    // Handle error
}
fmt.Println(key)

If you need the key in PEM encoded form, simple add the appropriate header and footer, eg -----BEGIN PUBLIC KEY----- & -----END PUBLIC KEY----- . 如果您需要PEM编码形式的密钥,只需添加适当的页眉和页脚即可,例如-----BEGIN PUBLIC KEY----------END PUBLIC KEY----- Note that the BEGIN header must start on its own line and end in a new line ( "\\n" ). 请注意,BEGIN标头必须以其自己的行开头并以新行( "\\n" )结尾。 The END header must also be proceeded by a new line. END标头也必须以新行开头。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM