【问题标题】:GO - How to convert public key from string to PEM formatGO - 如何将公钥从字符串转换为 PEM 格式
【发布时间】:2018-01-04 17:43:01
【问题描述】:

我正在尝试使用 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() 调用时出现的错误。

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

【问题讨论】:

  • pem 是一种字符串格式 - 您能更具体地说明您要转换的内容吗?
  • 感谢您的回复。我刚刚用更准确的信息更新了票。对于您的问题,当我将密钥作为字符串格式传递时,我得到“密钥的类型无效”。
  • 请将错误粘贴为文本而不是屏幕截图,因为您的错误已被截断。另外,您能否发布一个您收到的公钥示例,因为如果他们不知道它是什么格式,没有人可以提供帮助。因为它是公钥,所以不应该有任何安全问题。
  • 好的,但我的问题是您要转换的格式是什么?
  • 正如我所指出的,PEM 是一种字符串编码,而“字符串”不是密钥的特定编码。您需要知道要转换的密钥是什么格式才能成功转换。

标签: go jwt


【解决方案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 标头也必须换行。

【讨论】:

  • 标记为已解决。谢谢马丁,刚刚使用了 jwt.ParseRSAPublicKeyFromPEM([]byte(key)) ,其中“key”按照您的建议添加了页眉和页脚。
猜你喜欢
  • 2021-12-22
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多