ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 Istio 样例 JWT/JWKS 数据与 gen-jwt.py 脚本搭建端到端终端用户 JWT 认证

使用 Istio 样例 JWT/JWKS 数据与 gen-jwt.py 脚本搭建端到端终端用户 JWT 认证 使用 Istio 样例 JWT/JWKS 数据与 gen-jwt.py 脚本搭建端到端终端用户 JWT 认证【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio本指南围绕 security/tools/jwt/samples 目录中的样例数据与生成脚本展开讲解如何借助预签名好的demo.jwt与配套jwks.json结合 IstioRequestAuthentication策略快速验证终端用户end-userJWT 认证链路并深入解析gen-jwt.py的全部参数与内部实现让你能够按需签发自定义测试令牌。读完本文你将具备在 Istio 网格内复现 JWT 认证演示、构造带任意 claims 的测试令牌以及重新生成整组演示密钥数据的完整能力。一、目录定位这套样例在 Istio 安全体系中的作用Istio 的 JWT 终端用户认证建立在两个核心 API 之上RequestAuthentication声明哪个 issuer 的 JWT 需要被校验与AuthorizationPolicy声明校验通过后允许谁访问。要在本地环境验证这一链路前提是手头有一套签名私钥、公钥集JWKS以及用该私钥签发的 JWT 令牌。security/tools/jwt/samples 目录正是为演示而准备的现成材料共包含 7 个文件demo.jwt预签发的示例 JWT可直接用于请求测试groups-scope.jwt携带 group/scope 类 claims 的第二个样例令牌可用于基于组或作用域的鉴权演示jwks.json与demo.jwt对应的公钥 JWKS 集key.pem演示私钥RSA 2048仅用于本地测试与重新生成gen-jwt.py基于jwcrypto的 JWT 签发脚本同时具备导出 JWKS 的能力requirements.txtPython 依赖声明内容为jwcryptoREADME.md使用说明即本文所依据的主文档。同目录下还有面向Google 服务账号签名 JWT场景的姊妹脚本 sa-jwt.py本文末尾会一并介绍。整套样例的生成逻辑对应 Istio 官方文档中JWT 认证章节的演示数据来源是安全策略集成测试与手工验证的基础设施。二、快速上手用预生成的 demo.jwt 验证认证链路demo.jwt是已经用目录内key.pem签名好的令牌因此开箱即用、无需任何修改即可测试 Istio 的 JWT 认证策略。2.1 配置基于 mock JWKS 的 RequestAuthentication首先下发一个引用上述公钥集的终端用户认证策略原文档示例的jwksUri指向线上 raw 文件的镜像实际操作时请把该 URL 替换为你可以访问到的jwks.json托管地址例如 CI 或本地文件服务器令牌校验所需的kid匹配逻辑可参见下文源码分析apiVersion: security.istio.io/v1 kind: RequestAuthentication metadata: name: jwt-example spec: selector: matchLabels: app: httpbin jwtRules: - issuer: testingsecure.istio.io jwksUri: https://raw.githubusercontent.com/istio/istio/master/security/tools/jwt/samples/jwks.json策略要点说明spec.selector通过 Pod 标签圈定生效范围此处限定app: httpbin的工作负载jwtRules中的issuer必须与令牌内issclaim 完全一致即testingsecure.istio.iojwksUri指向的 jwks.json 内含一把 RSA 公钥其kid为DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ与 demo.jwt 头部的kid完全对应——这是校验能否命中的关键。2.2 demo.jwt 内部负载解析demo.jwt的明文 payload 如下这是原文档给出的权威内容{ exp: 4685989700, foo: bar, iat: 1532389700, iss: testingsecure.istio.io, sub: testingsecure.istio.io }几个值得注意的设计点exp过期时间被设为一个极其遥远的未来时间戳4685989700对应公元 2118 年因此该令牌可以在任何时间点原样测试而不会因过期失效自定义 claimfoo: bar常被后续AuthorizationPolicy的条件规则如requestPrincipals之外的 claims 匹配引用起到占位自定义字段的作用iss与sub相同这是原文档与脚本的默认约定见下文-sub参数说明。2.3 通过入口网关发起带令牌的请求拿到令牌后即可发起真实请求验证认证结果原文档命令中的令牌需取自你实际可访问的demo.jwt副本仓库内文件即同一份数据TOKEN$(curl demo.jwt 的可访问地址 -s) curl --header Authorization: Bearer $TOKEN $INGRESS_HOST/headers -s -o /dev/null -w %{http_code}\n预期行为若RequestAuthentication与网关配置正确、令牌校验通过服务端返回200若签发方不被信任、令牌过期或签名不匹配则返回401。这正是以仓库内样例数据 真实流量验证 Istio 安全策略的最小闭环。三、按需签发gen-jwt.py 参数详解与典型用法原文档提供的一个核心能力是不依赖预生成令牌而是用脚本现场签发自定义内容的 JWT。3.1 安装依赖脚本基于 Python 的jwcrypto库依赖声明见 requirements.txt首次使用前执行pip install jwcrypto3.2 最小签发示例以下命令使用目录内的演示私钥签发一个 300 秒后过期、issuer 为new-issuersecure.istio.io的新令牌TOKEN$(./gen-jwt.py key.pem --expire300 --iss new-issuersecure.istio.io)3.3 全部参数一览对应源码 argparse 定义从 gen-jwt.py 的ArgumentParser定义可以整理出完整参数语义参数默认值含义与取值范围key位置参数必填私钥 PEM 文件路径可由openssl genrsa -out key.pem 2048生成-iss/--isstestingsecure.istio.io写入 payload 的issclaim-aud/--aud无audclaim支持逗号分隔多个 audience 会解析为字符串数组-sub/--sub同isssubclaim未提供时自动取iss的值-claims/--claims无附加普通 claim格式name1:value1,name2:value2仅支持字符串值-jwks/--jwks无指定后脚本会把该私钥对应的公钥 JWKS写入此输出文件-expire/--expire36001 小时JWT 过期时长单位秒整数-listclaim/--listclaim无数组型 claim可重复指定如-listclaim key1 val2 val3 -listclaim key2 val3 val4仅支持字符串值-nestedclaim/--nestedclaim无嵌套型 claim放在nestedkey之下同样可重复指定-nestedkey/--nestedkeynested仅在提供nestedclaim时生效指定嵌套 claims 的父键名3.4 实战签发覆盖多种 claim 类型的完整示例脚本 docstring 中给出了一个组合示例一次性覆盖自定义字符串 claim、list claim 与嵌套 claim./gen-jwt.py --iss example-issuer --aud foo,bar \ --claimsemail:foogoogle.com,dead:beef \ -listclaim key1 val2 val3 -listclaim key2 val3 val4 \ key.pem逐项说明其在 payload 中的落点对应源码 gen-jwt.py--claimsemail:foogoogle.com,dead:beef→ 生成email: foogoogle.com与dead: beef--aud foo,bar→ 因含逗号aud被生成为字符串数组[foo, bar]-listclaim key1 val2 val3→ 生成key1: [val2, val3]若叠加-nestedclaim key1 val2 val3→ 会生成嵌套对象nested: {key1: [val2, val3], nested-2: {同构拷贝}}其中nested-2是对嵌套内容的浅拷贝源码 gen-jwt.py适合演练claims 中嵌套对象的匹配场景。四、深入原理gen-jwt.py 的签名与 JWKS 导出实现读懂脚本实现能帮你准确理解令牌为何能被 Istio 验证通过。核心流程集中在 gen-jwt.py加载私钥读取 PEM 文件并encode(utf-8)后交给jwk.JWK.from_pem(...)由jwcrypto解析为 JWK 对象key可选导出 JWKS当传入-jwks时脚本以key.export(private_keyFalse)导出仅含公钥的 JSON并手工包裹成{ keys: [...] }结构写入目标文件——jwks.json 的格式正是如此含e/kid/kty/n四个字段组装 payload以当前 Unix 时间戳now为基准计算exp now expire与iat now随后按 3.3 的参数规则填充iss/sub/aud/自定义 claims签名构造jwt.JWT(header{alg: RS256, typ: JWT, kid: key.key_id}, claimspayload)调用make_signed_token(key)完成 RSA-SHA256 签名后serialize()输出。值得强调的验证关键点是第 2、4 步的一致性jwks.json中公钥的kid与 JWT 头部声明的kid都取自同一个 JWK 对象key.key_id因此用-jwks一并生成的令牌与公钥集必然配对。你可以自行核对仓库中 jwks.jsonkid: DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ与 demo.jwt 头部解码结果{alg:RS256,kid:DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ,typ:JWT}完全吻合这正是 Istio 能据kid从 JWKS 中挑选正确公钥完成验签的前提。五、重新生成整套密钥与样例面向开发者的维护流程原文档明确说明以下流程仅面向需要刷新演示数据/密钥的开发者。共两步第一步重新生成 RSA 私钥openssl genrsa -out key.pem 2048该命令产出 2048 位 RSA 私钥文件key.pem作为后续签发与公钥导出的唯一签名源。第二步基于新私钥重建 JWKS 与 demo 令牌原文档给出的命令如下其中-jwks亦写作--jwksgen-jwt.py key.pem -jwks./jwks.json --expire3153600000 --claimsfoo:bar demo.jwt这条命令实际做了三件事与上文实现分析一一对应-jwks./jwks.json把新私钥对应的公钥以 JWKS 格式写入jwks.json同时保证该文件的kid与新令牌头部kid一致--expire3153600000将exp设置为约 100 年后的时间点3153600000 秒复刻demo.jwt长期有效、便于随时测试的取值风格--claimsfoo:bar注入foo: bar自定义 claim与现行 demo.jwt 中的负载保持同构。注意命令输出被重定向写入demo.jwt即令牌直接落盘。重新生成后请同步更新所有引用旧jwks.json的RequestAuthentication配置并建议保留目录中的groups-scope.jwt生成方式同样用带 group/scope claims 的参数组合即可复现因为一旦私钥轮换所有旧令牌都会因验签公钥不匹配而失效。六、姊妹工具sa-jwt.py 生成 Google 服务账号签名的 JWT当演示场景需要由受信任第三方Google签发令牌以模拟真实云上用户身份时可改用同目录的 sa-jwt.py其完整使用说明见 security/tools/jwt/README.md。要点如下依赖pip install google-auth对应 requirements.txt前置条件在 Google Cloud 控制台创建或选用已有服务账号并从其操作菜单导出 JSON 类型的私钥文件下载到本地用法./sa-jwt.py service_account.json -iss 邮箱 -aud aud1,aud2 [-sub ...] [-claims name1:value1,...]其中-iss应为该服务账号的邮箱未指定-sub时同样默认取iss运行python sa-jwt.py -h可查看完整帮助文本。与gen-jwt.py相比差异仅在于签名密钥的来源前者为本地 PEM 私钥、后者为 Google 服务账号密钥而最终产物都是可用于 Istio 认证测试的 RS 系签名 JWT。七、总结从样例数据到可信验证的最小实践路径围绕 security/tools/jwt/samples 提供的材料你可以按以下路径完成一次完整的 Istio 终端用户 JWT 认证验证下发引用 jwks.json 的RequestAuthenticationissuer 为testingsecure.istio.io直接使用 demo.jwt 作为Authorization: Bearer TOKEN发起请求观察200/401需要自定义负载issuer、audience、过期时间、数组/嵌套 claims时用gen-jwt.py配合key.pem现场签发并用-jwks同步导出配对的公钥集作为维护者需要轮换演示密钥时执行openssl genrsagen-jwt.py -jwks ...两步重建全套数据。这套样例令牌 生成脚本的组合既让首次接触 Istio 认证的用户能在分钟级内跑通验证也为需要批量构造多样化 JWT claims 来测试鉴权策略的开发者提供了可编程的签发入口——这正是它被长期保留在仓库安全工具链中的价值所在。【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表