如何创建 JWKS 公钥/私钥对,类似于可以在 https://mkjwk.org/ 手动创建的那个,包括密钥 ID (kid
) 和密钥使用 (use
)?我使用 cryptography
模块生成 RSA 密钥对,使用 python-jose
将密钥提取为 JWK,但创建的密钥不包括 kid
和 use
(不出所料,作为它们尚未在任何地方指定)。
代码:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from jose import jwk, constants
import json
key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = key.public_key().public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
private_key = key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
print(json.dumps(jwk.RSAKey(algorithm=constants.Algorithms.RS256, key=public_key.decode('utf-8')).to_dict()))
print(json.dumps(jwk.RSAKey(algorithm=constants.Algorithms.RS256, key=private_key.decode('utf-8')).to_dict()))
由上述代码片段生成的公钥(无 kid
或 use
属性):
{
"alg": "RS256",
"kty": "RSA",
"n": "tqbcR_6JC....OKQ",
"e": "AQAB"
}
答案 0 :(得分:1)
我相信 kid
只是在生成密钥的过程中没有使用的一段元数据(任何字符串)。
在 use
的情况下,它可能有点相似,但根据用途,您需要不同的非对称加密方案(您可以参考最知名的非对称加密系统 RSA加密和签名方案的描述)。
总而言之,您很可能可以根据上述信息重新创建 JSON 的确切结构,向 JSON dict 添加适当的键。
答案 1 :(得分:0)
另一种使用 jwcrypto
库生成 JWKS 公钥/私钥对的方法:
from jwcrypto import jwk
key = jwk.JWK.generate(kty='RSA', size=2048, alg='RSA-OAEP-256', use='enc', kid='12345')
public_key = key.export_public()
private_key = key.export_private()
由上面的代码片段生成的公钥:
{
"kty": "RSA",
"alg": "RSA-OAEP-256",
"kid": "12345",
"use": "enc",
"e": "AQAB",
"n": "0YclBn...vV7y7w"
}