Ключ имеет недопустимый тип при разборе токена аутентификации JWT в jwt-go

Я настраиваю промежуточное ПО безопасности в GoLang API, и мне кажется, что все настроено правильно, но я получаю сообщение об ошибке «ключ неверного типа».

Я подтвердил, что мой алгоритм подписи - RS256, а параметры промежуточного программного обеспечения настроены @ SigningMethod: jwt.SigningMethodRS256

У меня есть действующий токен ... все остальное в промежуточном программном обеспечении проходит.

Точкой входа в эту ошибку в промежуточном программном обеспечении является метод jwt.ParseRSAPrivateKeyFromPEM.

Я изолировал ошибку внутри пакета github.com/dgrijalva/jwt-go/rsa.go Verify () в строке: 62 - это тип ErrInvalidKeyType, который выдается. Все параметры до этого момента кажутся надежными и подходящими (например, m | signatureString | signature | key), но этот ключ. (* Rsa.PublicKey) не работает… в моем отладчике (GoLand) я проверяю * rsa и получаю ответ 'не удалось найти значение символа для rsa'…

if rsaKey, ok = key.(*rsa.PublicKey); !ok {
    return ErrInvalidKeyType
}

обратите внимание ... если это еще не слишком очевидно ... я новичок в GoLang

----- ОБНОВИТЬ -----

Таким образом, на самом детальном уровне паника начинается с go / 1.12.8 / libexec / src / crypto / rsa / rsa.go: 49 с

func (pub *PublicKey) Size() int {
    log.Printf("SIZE ::: %v :: %v",pub.N.BitLen(), pub.N)
    return (pub.N.BitLen() + 7) / 8
}

Паб рассматривается как разыменование нулевого указателя. Я прослеживаю его до мультиплексора ->

крипто / rsa.VerifyPKCS1v15 (...) /usr/local/Cellar/go/1.12.8/libexec/src/crypto/rsa/pkcs1v15.go:275

github.com/dgrijalva/jwt-go. (* SigningMethodRSA) .Verify (...) /Users/me/Sandbox/src/github.com/dgrijalva/jwt-go/rsa.go:73

github.com/dgrijalva/jwt-go. (* Парсер) .ParseWithClaims (...) /Users/me/Sandbox/src/github.com/dgrijalva/jwt-go/parser.go:77

github.com/dgrijalva/jwt-go. (* Парсер) .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

github.com/auth0/go-jwt-middleware. (* JWTMiddleware) .CheckJWT (...) /Users/me/Sandbox/src/github.com/auth0/go-jwt-middleware/jwtmiddleware.go:203

github.com/auth0/go-jwt-middleware. (* JWTMiddleware) .Handler.func1 (...) /Users/me/Sandbox/src/github.com/auth0/go-jwt-middleware/jwtmiddleware.go: 110

сеть / http.HandlerFunc.ServeHTTP (...) /usr/local/Cellar/go/1.12.8/libexec/src/net/http/server.go:1995

github.com/gorilla/mux. (* Маршрутизатор) .ServeHTTP (...) /Users/me/Sandbox/src/github.com/gorilla/mux/mux.go:210 + 0xe3


person beauXjames    schedule 20.08.2019    source источник
comment
Возникает очевидный вопрос: передавали ли вы KeyFunc функции синтаксического анализа, которая возвращает экземпляр rsa.PublicKey?   -  person Burak Serdar    schedule 20.08.2019
comment
Я дословно следил за настройкой, рекомендованной Auth0 для создания всех этих лесов с помощью jwtMiddleware --- auth0.com/docs/quickstart/backend/golang/01-authorization   -  person beauXjames    schedule 20.08.2019
comment
Интересно, каков результат jwt.ParseRSAPublicKeyFromPEM ([] byte (cert)). Возможно, вы можете проверить ошибку вместо того, чтобы игнорировать ее, а также распечатайте результат, чтобы увидеть, действительно ли то, что он возвращает, является открытым ключом   -  person Burak Serdar    schedule 20.08.2019
comment
результат этого метода - {* crypto / rsa.PrivateKey} nil   -  person beauXjames    schedule 20.08.2019
comment
Это закрытый ключ, а не открытый ключ. Вместо этого верните key.Public ().   -  person Burak Serdar    schedule 20.08.2019
comment
Итак, я изменил метод ParseRSAPrivateKeyFromPEM на ParseRSAPublicKeyFromPEM, а тип результата - * crypto / rsa.PublicKey, но остался нулевым ... как еще я могу сообщить об этой проблеме, чтобы ее можно было реплицировать?   -  person beauXjames    schedule 20.08.2019
comment
Возможно, я неправильно понял твой ответ. Вы имели в виду, что возвращаемый тип - rsa.PrivateKey, но он равен нулю? Если он равен нулю, он должен был вернуть ошибку, отличную от нуля, и я предполагаю, что он скажет, что с ним не так.   -  person Burak Serdar    schedule 21.08.2019
comment
добавлена ​​дополнительная информация о проверке   -  person beauXjames    schedule 21.08.2019
comment
Я предлагаю вам записать информацию об ошибке: result, err: = jwt.ParseRSAPublicKeyFromPEM ([] byte (cert)) и вывести ошибку, если не nil.   -  person Burak Serdar    schedule 21.08.2019
comment
да ... сделал это ... все еще отслеживаю его до этого указателя crypto * PublicKey, но не могу понять, почему   -  person beauXjames    schedule 21.08.2019
comment
В чем ошибка? Похоже, что ParseRSAPublicKeyFromPEM возвращает ошибку.   -  person Burak Serdar    schedule 21.08.2019
comment
Я нашел это. Глубоко в недрах go / 1.12.8 / libexec / src / encoding / pem / pem.go: 82 есть проверка на pemStart ('\ n ----- BEGIN'). У меня было всего 4 тире, когда ожидалось 5. # @ $! @ #! @!   -  person beauXjames    schedule 21.08.2019


Ответы (1)


Нашел ответ. Это ненастоящий ответ, но он устранил проблему.

Вместо «----- BEGIN» и «END -----» я использовал «---- 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
}
person beauXjames    schedule 21.08.2019