You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用PyJWT从零生成非对称加密JWK密钥的技术咨询

关于使用PyJWT从零生成非对称加密JWK密钥的技术咨询

嘿,我懂你在OIDC场景里找PyJWT生成非对称JWK的痛点——官方文档这块确实没给啥现成例子,看着jwcrypto的代码又不想费劲移植,对吧?我来给你捋个清晰的步骤,用PyJWT配合它依赖的cryptography库就能搞定,完全不用额外折腾!

首先得确保你装了必要的依赖:

pip install pyjwt cryptography

生成RSA密钥对并转换为JWK(OIDC最常用的非对称算法)

RSA是OIDC里最普遍的选择,下面是完整的代码示例:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
import jwt
import json
import uuid

# 生成2048位RSA私钥(OIDC推荐2048或4096位)
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)

# 可选:把私钥序列化为PEM格式保存到本地(方便后续复用)
pem_private = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()  # 无加密,如需加密可替换成对应的算法
)
with open("private_key.pem", "wb") as f:
    f.write(pem_private)

# 获取公钥
public_key = private_key.public_key()

# 把公钥和私钥转换成JWK格式
public_jwk = jwt.PyJWK(public_key).to_dict()
private_jwk = jwt.PyJWK(private_key).to_dict()

# 给JWK添加kid(密钥ID,OIDC建议添加,用于标识不同密钥)
key_id = str(uuid.uuid4())
public_jwk["kid"] = key_id
private_jwk["kid"] = key_id

# 打印结果看看
print("公钥JWK(可放到JWKS里对外暴露):\n", json.dumps(public_jwk, indent=2))
print("\n私钥JWK(用于签名JWT,注意保密):\n", json.dumps(private_jwk, indent=2))

关键说明

  • PyJWT本身没有直接的“生成JWK”函数,但它的PyJWK类可以直接把cryptography生成的密钥对象转换成标准JWK字典,完美适配OIDC的JWKS要求。
  • 生成的JWK默认会包含kty(密钥类型,这里是RSA)、alg(默认RS256,符合OIDC常用签名算法)、use(默认sig,表示用于签名)这些核心字段,如果你需要调整,可以直接修改字典里的键值。
  • 如果需要用椭圆曲线(EC)密钥(比如P-256曲线),流程几乎一样,只需要替换密钥生成的部分:
from cryptography.hazmat.primitives.asymmetric import ec

# 生成P-256椭圆曲线密钥对
ec_private_key = ec.generate_private_key(ec.SECP256R1())
ec_public_jwk = jwt.PyJWK(ec_private_key.public_key()).to_dict()

这样你就能轻松生成符合OIDC要求的非对称JWK了,不用再去移植其他库的代码~

备注:内容来源于stack exchange,提问作者AstraLuma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:28:09