如何创建JWKS公钥/私钥对,类似于可以在https://mkjwk.org/手工创建的密钥对,其中包括Key ID (kid)和Key Use (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"
}发布于 2021-05-18 15:50:34
我相信kid只是一个元数据(任何字符串),在生成密钥的过程中没有使用它。
在use的情况下,这可能有点类似,但取决于您对非对称加密的不同使用方式(您可以参考最著名的非对称加密系统RSA。
总之,您很可能根据上面的信息重新创建JSON的确切结构,向JSON添加适当的键。
发布于 2021-05-19 16:58:23
另一种使用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"
}https://stackoverflow.com/questions/67589495
复制相似问题