Как получить JWK и использовать их при подписании JWT? - PullRequest
1 голос
/ 03 марта 2020

Я читаю этот блог о JWT и о том, как вы можете использовать его часть для подписи, чтобы проверить, действительно ли токен был выдан доверенной стороной.

https://hackernoon.com/json-web-tokens-jwt-demystified-f7e202249640

Веб-ключ JSON (JWK) - это объект JSON, содержащий хорошо известный ключ publi c, который можно использовать для проверки подписи подписанного JWT.

Если эмитент вашего JWT использовал асимметричный ключ c для подписи JWT, он, скорее всего, будет содержать файл с именем JSON Web Key Set (JWKS). JWKS - это объект JSON, содержащий ключи свойств, который в свою очередь содержит массив объектов JWK.

Вот фрагмент кода java из моей кодовой базы, который генерирует для меня JWT:

new JwtBuilder().setClaims(claims).setExpiration(expiration).signWith(signatureAlgorithm, sharedSecret).compact();

Я не совсем понимаю, как получить JWK и как их использовать для подписи? Я не нашел примеров в сети.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 апреля 2020

каждый открытый сервер идентификаторов должен предоставить арендатору конечную точку следующим образом:

  https://--YOUR DOMAIN----/.well-known/jwks.json

если вы посетите эту конечную точку, вы увидите это в json формате

{
  keys: [
    {
      alg: 'RS256',
      kty: 'RSA',
      use: 'sig',
      n: 'tTMpnrc4dYlD8MtmPnW3xZNbLxkaGCUwTqeKB4dfLg11dEpMyQEc4JRxUvRzp9tz00r6lkZ1ixcvIiuB_eMVckU8VyFSFWBSAxp5duBk6lRpYk-QjK3kEdPxYLxyW84gNzwMi-XW8zxJbsOa-cRM9sCb62Qz2yfWoQfimoFXsCnVHq496kizO7gZ972JefvTce1_n9dd_1p0K6c14qcCXtF6hbA_gQ0N7h3IyloBqiusKyTsV-ZrMZDldZkI-4v7s49TdcRZgEOvSapMz5YyoDvAWzuWGEiljkjkCOo0Mr5Sioi2x0dBm6nJ2WVYfZrwEF5J',
      e: 'AQAB',
      kid: 'NTY2MjBCNzQ1RTLPQzk3NzczRRTMQ0E4NzE2MjcwOUFCRkUwRTUxNA',
      x5t: 'NTY2MjBCNzQ1RTJPLzk3NzczRUNPO0E4NzE2MjcwOUFCRkUwRTUxNA',
      x5c: [Array]
    }
  ]
}

Что is x5 c?

Параметр заголовка «x5 c» (цепочка сертификатов X.509) содержит сертификат X.509 publi c или цепочку сертификатов [RFC5280], соответствующую используемому ключу для цифровой подписи JWS. Сертификат или цепочка сертификатов представлены в виде JSON массива строк значений сертификата. Каждая строка в массиве представляет собой значение сертификата PKIX DER (ITU.X690.2008] в кодировке base64 (не в кодировке base64url). Сертификат, содержащий ключ publi c, соответствующий ключу, используемому для цифровой подписи JWS, ДОЛЖЕН быть первым сертификатом. Это МОЖЕТ сопровождаться дополнительными сертификатами, причем каждый последующий сертификат используется для сертификации предыдущего. Получатель ДОЛЖЕН проверить цепочку сертификатов в соответствии с RF C 5280 [RFC5280] и считать сертификат или цепочку сертификатов недействительными в случае сбоя проверки. Использование этого параметра заголовка НЕОБЯЗАТЕЛЬНО.

Если вы проверите массив x5 c, вы увидите очень длинную строку. Вы должны принять это значение и разделить их для каждых 64 значений. это очень просто. Вот пример:

          -----BEGIN CERTIFICATE-----
MIIDBzCCAe+gAwIBAgIJY5XAn120Mst4MA0GCSqGSIb3DQEBCwUAMCExHzAdBgNV
BAMTFmRl2e11ZGlrdGt5Mi5hdXRoMC5jb20wHhcNMTkwOTI5MjAxNjE4WhcNMzMw
NjA3MjAxNjE4WjAhMR8wHQYDVQQDExZkZXYtdWe3a3RreTIuYXV0aDAuY29tMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AeIIBCgKCAQEAtTMpnrc4dYlD8MmPnW3xZNbL
xkaGCUwTqeKB4etLg11dEpMyQEc4JRxUvRzp9t656lkZ1ixcvIiuB/eMVckU8VyF
SFWBSAxp5vrBk6lRpYk+QjK3kEdA9PxYLxyW84gNzwMi+XW8zxJbsOa+cRM9sCb6
2Qz2fWoQfimoFXsCnVHq496kp93izO7gZ972JefvTce1/n9dd/1p0K6c14qcCXtF
6hbA/gQ0N7h3IyloBqiusKyTsV+ZrMZDldZkI+4v7s49TdcRZgEOvSapMz5YyoDv
AWzuWGEilCOo0Mr5Sioi2x0dBm6nJ2WVYfZrwEF5JTz9LlKjYAqJ6ETGYKhjkwID
AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQme5xBKaloQKQr5oxt
7uRlWthe6jAOBgNVHQ8BAf8EBAMCAoQwDQYJKoZIhvcNAQELBQADopEBABpfpizn
MSJ67HDX358Rav5CYFEeIBeHXrxDQLprKdNzNSxOJ6tRpk6OF0Qs52wCEbrUXYBu
MRjmmmvN3bBHGMmq/g4VPZGDLh/JF5xJjRj13um8Rfua3S2NE4nZUYfPWctk56mN
UUQ9DUkbPRbLEJKCqVSQNagk6TEGe4dfRGdUNvAzDBglMTFOSrY1GAOJdUA1+bPb
3MnSdfyIyxSfPK5oDSQ4puMWKme2ZdGGPj+urSxs1Tuwkv0DxohdV+35WUIJcJPU
ARJecLX7rjyAzqqZE1sJGfsY5ob09380/BTAwHHP/KjiOFhilJ5OoHiU62D+mEKA
DHqlJzoj1VX/3d8=
                -----END CERTIFICATE-----

Итак, когда вы запускаете процесс проверки:

//you get the token
//you decode the token
//you compare the kid which is in the header of the token

//jwk.kid the one that you get when you visit the /.well-known url above
if (jwk.kid === decodedToken.header.kid){
// in verification process you have to use the decoded code and the certificate 
// to verify the signature

}

этот процесс задает c для алгоритма 'RS256'. RS256 генерирует асимметричную c подпись, что означает, что закрытый ключ должен использоваться для подписи JWT, а другой публичный c ключ должен использоваться для проверки подписи. В отличие от алгоритмов симметрии c, использование RS256 дает гарантии того, что Auth0 является подписывающим лицом JWT, поскольку Auth0 является единственной стороной с закрытым ключом. Для проверки алгоритмов симметрии c необходимо использовать закрытый ключ.

...