Создать RS256 JWT в Bash - PullRequest
       15

Создать RS256 JWT в Bash

0 голосов
/ 10 октября 2019

Я пытаюсь создать токен RSW6 JWT, используя только bash и openSSL (у меня есть ограниченные инструменты разработки).

Я разработал скрипт, который берет заголовок и полезную нагрузку из текстовых файлов. (убирая переводы строк и т. д.), base-64URL кодирует их и объединяет их вместе с '.'separator.

Затем я пытаюсь подписать выходные данные, которые я также кодирую с помощью base-64URL и добавляю в конец (с помощью другого разделителя '.'). Я считаю, что это точно отражает модель JWT.

Мой личный ключ и сертификат были сгенерированы с использованием openSSL:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ./privateKey2.key -out ./certificate2.crt

Мой открытый ключ был сгенерирован из личного ключа с использованием:

openssl rsa  -pubout -in ./privateKey2.key > ./publicKey2.key

Затем у меня есть следующий bash-скрипт, который обрабатывает задание:

cat header.txt | tr -d '\n' | tr -d '\r' | openssl base64 | tr +/ -_ | tr -d '=' > header.b64
cat payload.txt | tr -d '\n' | tr -d '\r' | openssl base64 | tr +/ -_ |tr -d '=' > payload.b64
printf "%s" "$(<header.b64)" "." "$(<payload.b64)" > unsigned.b64
rm header.b64
rm payload.b64
openssl rsautl -sign -inkey privateKey2.key -in unsigned.b64 -out sig.txt
cat sig.txt | openssl base64 | tr +/ -_ | tr -d '=' > sig.b64
printf "%s" "$(<unsigned.b64)" "." "$(<sig.b64)" > jwt.txt
rm unsigned.b64
rm sig.b64
rm sig.txt

Я считаю, что сам скрипт работает, но всякий раз, когда я загружаю окончательный вывод в инструмент тестирования jwt.io, он говорит мнеподпись недействительна (она может прочитать содержимое, а заголовок и полезная нагрузка верны).

Неправильно ли мое использование openssl rsautl?

Рад включить ключи / примеры данных, если они помогут

Пример вывода:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2
MjM5MDIyfQ.fE-btiyskyDrO1mQXcICP0udbCkdV9D_50CYNbpRVgod6EPjKmbOJK-EA7vn7s5l
TtkvKw0m1r45poGApBT4SA_ChmEgsPzhGwxd2xpInesRon-mWTzsUqqz0C1CcegT
n9Z19JzGJ7wUjomg7viKI1OP7Ei6TptINE8hPqEBPPpeO2PfT5IevMb1XytaCuTO
R1JMurgwsIa0Kq3LaFoAk1stUnTtJRI8-NHzWqmUiQpq-K1eteBtT9ZvKXJ_6ReY
_AetoeqmEDVQO_UV2ae_dKd4QHSV8D-ryJFc-OEYWzgwGeqXSBMNVMzsXKSUIR8C
sfvZ2hvwbQI2f0J6gZQw0w

Соответствующий открытый ключ

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1YbvZ3CPPr3X47J/pqCD
ciE0AhRbiBrybu4T3GbbHfGYROaPSKx2LfXCwAlayln5zNaZ14cvlDHEpCIQviPk
Qv5Ux16R2QouhF0ZugyMHLQkusVXG6Va14eFVKkcO2g1c25bOMAk4V3vSsVnMMQS
fTPunpGVrBUBo2We5P+cKldBNXKBlXEAIRGc4/fTcTB4F8opP+x5ACIZ04SWKafJ
MSvujIfpBxs476bvxA5xlPQiOhbOIo/bhPMJI6AlaDTJ03pGTOYjR5jZlB03j4YD
EF/2hhidvvFnLHdPkewzDsn0aZi+fqBNvQhS0hutnvp6F8hGL9e5hh8G7a2AXy9F
2QIDAQAB
-----END PUBLIC KEY-----

1 Ответ

0 голосов
/ 10 октября 2019

Успешно решено это. Это было вызвано несколькими проблемами:

  1. openssl base64 вставляет возврат каретки каждые 70 с лишним символов по умолчанию. Я думаю, что вы можете переопределить это, но просто воспользовавшись командой base64, вы решили это.
  2. Мой шаг подписания был неверным. Я заменил rsautl на dgst следующим образом:

    openssl dgst -sha256 -sign private.key -out sig.txt unsigned.b64

RS256 подписи сейчаспройти проверку в jwt.io

Полный рабочий код (для потомков):

cat header.txt | tr -d '\n' | tr -d '\r' | base64 | tr +/ -_ | tr -d '=' > header.b64
cat payload.txt | tr -d '\n' | tr -d '\r' | base64 | tr +/ -_ |tr -d '=' > payload.b64
printf "%s" "$(<header.b64)" "." "$(<payload.b64)" > unsigned.b64
rm header.b64
rm payload.b64
openssl dgst -sha256 -sign -privateKey2.key -out sig.txt unsigned.b64
cat sig.txt | base64 | tr +/ -_ | tr -d '=' > sig.b64
printf "%s" "$(<unsigned.b64)" "." "$(<sig.b64)" > jwt.txt
rm unsigned.b64
rm sig.b64
rm sig.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...