在 bash 中创建 RS256 JWT

2023-11-25

我正在尝试仅使用 bash 和 openSSL 构建 RS256 JWT 令牌(我可以使用的开发工具有限)。

我设计了一个脚本,它从 txt 文件中获取标头和有效负载(去掉换行符等),base-64URL 对它们进行编码并用“.”将它们连接在一起。分隔器。

然后,我尝试对输出进行签名,我还对其进行了 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-----

我结合了大卫·富尔顿的回答 with 来自 github 的文档还有一些jwt-with-bash and rsa 签名和验证 links.

由于尾随换行符(我认为),重构 base64 化很棘手。相反,只需将所有命令保持内联即可。

PEM=$( cat my/pem/file )
GITHUB_APP_ID=4 # Whatever your github app id is

NOW=$( date +%s )
IAT="${NOW}"
# expire 9 minutes in the future. 10 minutes is the max for github
EXP=$((${NOW} + 540))
HEADER_RAW='{"alg":"RS256"}'
HEADER=$( echo -n "${HEADER_RAW}" | openssl base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n' )
PAYLOAD_RAW='{"iat":'"${IAT}"',"exp":'"${EXP}"',"iss":'"${GITHUB_APP_ID}"'}'
PAYLOAD=$( echo -n "${PAYLOAD_RAW}" | openssl base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n' )
HEADER_PAYLOAD="${HEADER}"."${PAYLOAD}"
SIGNATURE=$( openssl dgst -sha256 -sign <(echo -n "${PEM}") <(echo -n "${HEADER_PAYLOAD}") | openssl base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n' )
JWT="${HEADER_PAYLOAD}"."${SIGNATURE}"

#${JWT} now has our token
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 bash 中创建 RS256 JWT 的相关文章

随机推荐

  • Python3 - 在 __eq__ 方法中使用 super() 会引发运行时错误:super(): __class__ cell not found

    我是猴子修补 eq 一个类的方法 我发现以下工作有效 def eq obj other if isinstance other str return obj name upper other upper else return object
  • 使用 jquery 仅创建一个开始 div 标签

    好吧 我已经在这个网站上搜索了很多 但似乎找不到答案 所以我将以更好的理由问同样的问题 我正在尝试使用 jquery 添加一个开始 div 标签 当我尝试使用 after 时 我最终得到了 我知道 jquery 不喜欢像我想要的那样本地创建
  • PowerShell 会话中的字符编码 (UTF-8) [重复]

    这个问题在这里已经有答案了 Hei all 作为控制台 终端爱好者和数据库管理员 PostgreSQL 使用正确的字符编码对我来说至关重要 因此 我希望我的客户端控制台 终端窗口始终设置为例如UTF 8 回到 Windows 的 CMD E
  • celeryd 进程的数量是否取决于 --concurrency 设置?

    我们在 Supervisor 后面运行 Celery 并启动它 celeryd events loglevel INFO concurrency 2 然而 这会创建一个最多三层深并包含最多 7 个 celeryd 进程的流程图 Superv
  • Matplotlib图形facecolor(背景颜色)

    有人可以解释一下为什么下面的代码在设置图形的面部颜色时不起作用吗 import matplotlib pyplot as plt create figure instance fig1 plt figure 1 fig1 set fighe
  • Ansible 循环处理 URI 调用的 JSON 输出

    一段时间以来我一直在尝试让它发挥作用 但我无法做到这一点 我希望这是我所缺少的一些很小的东西 我正在尝试解析使用 with items 的任务的 JSON 输出 我知道最终组件的变量列表将包含在结果数组中 name Get list of
  • Swift:检查字符串是否有数组中的元素

    我想检查一个字符串是否至少包含数组中的一个元素 我试过这个 但我认为它太长了 想象一下 如果我想要 if 语句中的所有字母表 我希望有一个适当的方法来做到这一点 var str Hello playground let typeString
  • 无法将项目导入到android studio

    我正在尝试使用this library 我已经添加 compile net rdrei android dirchooser library 2 0 aar 到依赖项 我的顶级构建文件 Top level build file where
  • 创建一个零填充的二维数组,其位置由向量索引

    我正在尝试向量化以下 MATLAB 操作 给定一个带有索引的列向量 我想要一个带有 相同数量的行和固定数量的列 这 矩阵用零初始化并在位置中包含 1 由索引指定 这是我已经编写的脚本的示例 y 1 3 2 1 3 m size y 1 Fo
  • EditorFor() 和 html 属性

    Asp Net MVC 2 0 预览版提供了类似的帮助器 Html EditorFor c gt c propertyname 如果属性名称是字符串 上面的代码将呈现一个文本框 如果我想将 MaxLength 和 Size 属性传递到文本框
  • 如何获取真实运行的进程名称?

    在 NET core 控制台应用程序中 我想获取正在运行的进程名称 我使用ProcessName正如文档所说 但它总是返回dotnet作为进程名称 而不是正在运行的实际下划线 dll 虽然它是一个 dll 但这是一个控制台应用程序 而不是一
  • 空格导致 PowerShell 路径分割

    在包含空格的路径中调用 exe 时 我遇到了 powershell 问题 PS C Windows Services gt invoke expression C Windows Services MyService exe 术语 C Wi
  • 如何在 Scala/Lift 中惯用地处理 null 检查?

    即使 Box 和 Option monad 很流行 我们仍然必须到处检查空值 到目前为止我想出的最好的方法是使用 Box 方法 Box possiblyNull map toString openOr 有一个更好的方法吗 我尝试使用 Box
  • Eclipse 终止键盘快捷键

    How do I get eclipse to terminate I use the keyboard shortcut Ctrl F11 to run a program and I cannot enable the terminat
  • Expo 构建 EAS - 本地 - 未找到 SDK 位置

    当我使用来自博览会的新构建工具时EAS在本地构建我的 React Native 应用程序 eas build platform android local 我收到一个错误 未找到 SDK 位置 使用 ANDROID SDK ROOT 定义位
  • 给定一组点,如何找到彼此最远的两个点? [复制]

    这个问题在这里已经有答案了 可能的重复 最大线性尺寸二维点集 我可以计算每个点之间的距离并取最大的距离 但是当有大量 gt 1000 点时 这听起来不是一种非常有效的方法 注意 这是针对 iPhone 的 所以我没有太多的处理能力 为什么不
  • 如果没有堆内存,如何释放 std::vector

    我有一个这样的类成员变量 vector
  • 在 Microsoft Outlook 中使用 applescript 创建新的外发邮件

    我正在尝试使用 Microsoft Outlook 2011 for mac 创建新的外发邮件 使用AppleScript 以下示例适用于10 6 8 tell application Microsoft Outlook set newMe
  • 数据库大小计算?

    估计具有以下特征的数据库有多大的最准确方法是什么 MySQL 1 Table with three columns id gt 大整型 字段1 gt varchar 32 字段2 gt 字符 32 field2 上有一个索引 您可以假设 v
  • 在 bash 中创建 RS256 JWT

    我正在尝试仅使用 bash 和 openSSL 构建 RS256 JWT 令牌 我可以使用的开发工具有限 我设计了一个脚本 它从 txt 文件中获取标头和有效负载 去掉换行符等 base 64URL 对它们进行编码并用 将它们连接在一起 分