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

时间:2017-07-28 15:20:43

标签: go jwt

我正在尝试使用jwt库来进行jwt验证。我通过调用其返回字符串格式的公钥的REST端点从另一个应用程序获取公钥。

所以现在当尝试以相同的字符串格式发送该公钥时,我得到了"无效的密钥格式"。有关如何将字符串格式化的密钥转换为有效的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
    })

以下是将密钥作为字符串传递给jwt.Pasrse()调用时得到的错误。

enter image description here

公钥: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsFWkb / eSl6I3DRVhaonW3DFy8EnL0yaPiDzCcOLuYfBjN9zZIR1wXmnMJFle1K89qHGg42wgweVTIwA1XFTfoUKSziwsjF6FscZX5H56ZYyS / wWiO3rWWynlfbSZt + ga71 + NDSU + A0Dy7Nn7ZgP8kRsu4UM5vE7QQTRERNiUKpzScN1cgZUFUqSddQmkwTEN8hH1mFX1Mum54NGqWIlmQxQDrOyogmMXIaaakhabcmuIPMULVVDVwUJC9sSDsc / j05qcZn3kkiEBRyiYB6ZLY2W7WfiV + DB7 / icPONsYSD0FxHWEGNnbqtiGoNf9WZWtaP + o8WMR9sB3GKGVnbLvbQIDAQAB

1 个答案:

答案 0 :(得分:1)

这是一个PEM编码密钥,它只是缺少BEGIN& END标题。关键是简单的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)

如果您需要PEM编码形式的密钥,只需添加适当的页眉和页脚,例如: -----BEGIN PUBLIC KEY-----& -----END PUBLIC KEY-----。请注意,BEGIN标头必须从它自己的行开始,并以新行("\n")结束。 END标题也必须以新行开头。