如何在python中创建JWKS公钥/私钥对?

时间:2021-05-18 15:35:26

标签: python python-3.x cryptography public-key-encryption

如何创建 JWKS 公钥/私钥对,类似于可以在 https://mkjwk.org/ 手动创建的那个,包括密钥 ID (kid) 和密钥使用 (use)?我使用 cryptography 模块生成 RSA 密钥对,使用 python-jose 将密钥提取为 JWK,但创建的密钥不包括 kiduse(不出所料,作为它们尚未在任何地方指定)。

代码:

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()))

由上述代码片段生成的公钥(无 kiduse 属性):

{
    "alg": "RS256",
    "kty": "RSA",
    "n": "tqbcR_6JC....OKQ",
    "e": "AQAB"
}

2 个答案:

答案 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"
}