在JWT go中解析JWT Auth令牌时,密钥的类型无效

在JWT go中解析JWT Auth令牌时,密钥的类型无效,go,jwt,rsa,auth0,jwt-go,Go,Jwt,Rsa,Auth0,Jwt Go,我正在GoLang API中设置安全中间件,似乎所有设置都正确,但我收到一个错误“密钥类型无效” 我已经确认我的签名算法是RS256,中间件选项配置为@SigningMethod:jwt.SigningMethodRS256 我有一个有效的令牌…中间件中的所有其他内容都通过了 中间件中此错误的入口点是jwt.ParseRSAPrivateKeyFromPEM方法 我已经在第62行的包github.com/dgrijalva/jwt-go/rsa.go Verify()中隔离了错误:62是抛出的E

我正在GoLang API中设置安全中间件,似乎所有设置都正确,但我收到一个错误“密钥类型无效”

我已经确认我的签名算法是RS256,中间件选项配置为@SigningMethod:jwt.SigningMethodRS256

我有一个有效的令牌…中间件中的所有其他内容都通过了

中间件中此错误的入口点是jwt.ParseRSAPrivateKeyFromPEM方法

我已经在第62行的包github.com/dgrijalva/jwt-go/rsa.go Verify()中隔离了错误:62是抛出的ErrInvalidKeyType。到目前为止,所有的参数看起来都是可靠和合适的(例如m | signingString | signature | key),但是这个密钥(*rsa.PublicKey)失败了…在我的调试器(GoLand)中,我检查了*rsa,得到了“找不到rsa的符号值”的响应

if rsaKey, ok = key.(*rsa.PublicKey); !ok {
    return ErrInvalidKeyType
}
请注意…如果还不太明显…我是GoLang的noob

-----更新-----

因此,在最细粒度的级别上,恐慌从go/1.12.8/libexec/src/crypto/rsa/rsa开始

func (pub *PublicKey) Size() int {
    log.Printf("SIZE ::: %v :: %v",pub.N.BitLen(), pub.N)
    return (pub.N.BitLen() + 7) / 8
}
pub被视为零指针解引用。我把它追溯到mux-->

加密/rsa.VerifyPKCS1v15(…) /usr/local/cillar/go/1.12.8/libexec/src/crypto/rsa/pkcs1v15.go:275

github.com/dgrijalva/jwt go.(*SigningMethodRSA)。验证(…) /Users/me/Sandbox/src/github.com/dgrijalva/jwt-go/rsa.go:73

github.com/dgrijalva/jwt go.(*Parser).ParseWithClaims(…) /Users/me/Sandbox/src/github.com/dgrijalva/jwt-go/parser.go:77

github.com/dgrijalva/jwt go.(*Parser).Parse(…) /Users/btschirhart/Sandbox/src/github.com/dgrijalva/jwt go/parser.go:20

github.com/dgrijalva/jwt go.Parse(…) /Users/me/Sandbox/src/github.com/dgrijalva/jwt go/token.go:89

com/auth0/go jwt中间件。(*JWTMiddleware)。检查jwt(…) /Users/me/Sandbox/src/github.com/auth0/go-jwt-middleware/jwt-middleware.go:203

github.com/auth0/go jwt中间件。(*JWTMiddleware.Handler.func1(…) /Users/me/Sandbox/src/github.com/auth0/go-jwt-middleware/jwt-middleware.go:110

net/http.HandlerFunc.ServeHTTP(…) /usr/local/ceral/go/1.12.8/libexec/src/net/http/server.go:1995

github.com/gorilla/mux.(*Router).ServeHTTP(…) /Users/me/Sandbox/src/github.com/gorilla/mux/mux.go:210+0xe3


找到了答案。这不是一个真正的答案,但它确实解决了问题

我在中间件中使用了“-BEGIN”和“END-->”来构建cert,而不是“-BEGIN”和“END-->”

在go/1.12.8/libexec/src/encoding/pem/pem.go:82中,有一个针对'----BEGIN'的检查,如果失败,它只返回nil

if bytes.HasPrefix(data, pemStart[1:]) {
    rest = rest[len(pemStart)-1 : len(data)]
} else if i := bytes.Index(data, pemStart); i >= 0 {
    rest = rest[i+len(pemStart) : len(data)]
} else {
    return nil, data
}

显而易见的问题是:您是否向返回rsa.PublicKey实例的parse函数传递了KeyFunc?我严格遵循了Auth0建议的设置,使用jwtMiddleware构建了这一切——我想知道jwt.ParseRSAPublicKeyFromPEM([]字节(cert))的结果是什么。也许您可以检查错误而不是忽略它,也可以打印结果以查看它返回的是否真的是公钥该方法的结果是{*crypto/rsa.PrivateKey}nili它是私钥,而不是公钥。而是返回key.Public()。