Как мне проверить подпись Auth0 JWT в терминале с OpenSSL с использованием открытого ключа?

#bash #openssl #jwt #auth0

#bash #openssl #jwt #auth0

Вопрос:

Я пытаюсь вручную проверить подпись в JWT с помощью OpenSSL. Fromjwt.io Я знаю, что открытый ключ проверяет подпись, но я не могу воспроизвести результат, используя OpenSSL в терминале. Чего мне не хватает?

 $ cat token.b64url 
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijg1c1ZGNW5Vdl9CS2tiWF9pTUVzTSJ9.eyJpc3MiOiJodHRwczovL3NvYmVyLmV1LmF1dGgwLmNvbS8iLCJzdWIiOiJWTlFFdjZqeFg1Tzl6T0o5ZzJqVW9JN2NzczdxcFg2MEBjbGllbnRzIiwiYXVkIjoiaHR0cHM6Ly9zb2JlcmFwaS5zb2xzdGFkLmRldi8iLCJpYXQiOjE1OTk2Mjk3ODMsImV4cCI6MTU5OTcxNjE4MywiYXpwIjoiVk5RRXY2anhYNU85ek9KOWcyalVvSTdjc3M3cXBYNjAiLCJndHkiOiJjbGllbnQtY3JlZGVudGlhbHMifQ.XlY8ClqS5TAQPELgnaWIhKqHif7v1DwyL0rSUeFVllx6NMLX7GhuYd6cH_4Qkxj10Sfm2qPIF4J9BEFUuJWrb_NfUuTVuodA41p-I6mnES1N3-4T-tC-ZEPhCEzE1R66M5c00SoRBbPLGUU--m87HpL-CcDE51FcrfXRjQR2o8qJsc0Pb_baRcGXQ6EquM3TW5ZX4XlJ7ErsWPv09Upo1ZO0sdP4c2SS3Agz_H05nOy7ZQh5JTBu9RpRqAs05VuREz1BbiuqDneUkn6rJrBcqHWJI1RrDY7fmYNBWX-c85_hEijnvfL7eg-UMb7A2uMp0_ZiEQSrpHusgkMyW4ZMEQ

# Convert to Base64
$ TOKEN_B64=$(cat token.b64url | tr '-' ' ' | tr '/' '_')

# Separate signature from token 
$ SIG_B64=$(echo $TOKEN_B64 | cut -d. -f3)

# Base64 decode the signature
$ echo $SIG_B64 | base64 -d > "sig.dat"

# separate body from JWT
$ DAT_B64=$(echo $TOKEN_B64 | cut -d. -f1-2)

# verify signature. (I would expect this call to return "Verification OK")
$ echo $DAT_B64 | openssl dgst -sha256 -verify public_key.pem -signature "sig.dat"
Verification Failure
  

Комментарии:

1. подпись представляет собой хэш из кодировки base64url header.payload . Почему вы меняете его на base64? И тогда само ваше преобразование также неверно, оно должно быть tr '_' '/' . В этом случае это может не повредить, поскольку заголовок и полезная нагрузка не содержат этих символов, но это просто удача.

2. не забывайте, что echo добавляет новую строку в конце, поэтому предпочитайте printf %s "$varname" , чтобы переменные расширения без кавычек, такие как $varname , выполняли разделение слов и глобализацию. Побочные эффекты переменной без кавычек и постороннего перевода строки могут повредить данные проверки ключа.

3. Исправление перевода не сработало. Также не было замены ‘echo’ на ‘printf’. Одна вещь, которую я нахожу странной, заключается в том, что декодированная подпись на один байт короче по сравнению с тем, когда я использую локально созданный набор ключей. Может ли это быть связано?