猿问

如何使用x5c解析一组JWK并验证JWT?

我想验证 JSON Web 令牌。用于验证的 JSON Web 密钥可在此 URL 下使用。这些是具有 x509 证书 (x5c) 的 JWK。根据另一个问题的答案,尝试了以下操作:


import  "github.com/dgrijalva/jwt-go"

import  "github.com/lestrrat-go/jwx/jwk"


func verifyToken(tokenBytes []byte) {

    token, err := jwt.Parse(string(tokenBytes), getKey)

    if err != nil {

        panic(err)

    }

}


func getKey(token *jwt.Token) (interface{}, error) {

    set, err := jwk.Fetch(context.Background(), "https://shareduks.uks.attest.azure.net/certs")

    if err != nil {

        return nil, err

    }

    keyID, ok := token.Header["kid"].(string)

    if !ok {

        return nil, err

    }

    key, ok := set.LookupKeyID(keyID)

    if !ok {

        return nil, errors.New("could not find key with kid")

    }

    return key, nil

}

但是我收到以下错误


panic: failed to parse JWK set: failed to unmarshal JWK set: failed to unmarshal key #1 (total 5) from multi-key JWK set: failed to unmarshal JSON into key (*jwk.rsaPublicKey): required field e is missing

我找不到使用x5c的示例。解决方案不必使用我在示例中使用的库。谢谢!


Helenr
浏览 251回答 2
2回答

蓝山帝景

该错误 () 的原因是此 URL 中的 JWK 集无效。即使 JWK 包含它,它仍然必须包含该特定所需的其他公钥成员,对于该 URL 中列出的 RSA 密钥,这意味着具有 和 。required field e is missingx5cktyne

有只小跳蛙

作者 http://github.com/lestrrat-go/jwx 在这里.我还没有合并解析证书的能力,但等待问题报告器的响应,但代码已经写 https://github.com/lestrrat-go/jwx/compare/topic/issue-350一旦该更改进入,就可以执行一些手臂扭曲并解析这些证书(伪代码):data := ... read from that URL ...rawSet := make(map[string]interface{})if err := json.Unmarshal(data, &rawSet); err != nil {   ...}// yikeskeys := rawset["keys"].([]interface{})firstKey := keys[0].(map[string]interface{})x5c := (firstKey["x5c"].([]interface{}))[0].(string)// Decode from base64 cert, _ := base64.RawStdEncoding.DecodeString(x5c)// turn the certificate into JWK (NOT YET MERGED)key, _ := jwk.ParseKey(cert, jwk.WithPEM(true))如果您需要将证书解析为 JWK 的功能,请在存储库中提交新问题,以便我跟踪更改。此外,如果要导入 http://github.com/lestrrat-go/jwx/jwk,则不妨对 JWT 使用 http://github.com/lestrrat-go/jwx/jwt;)
随时随地看视频慕课网APP

相关分类

Go
我要回答