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

如何在python中创建JWKS公钥/私钥对?,python,python-3.x,cryptography,public-key-encryption,Python,Python 3.x,Cryptography,Public Key Encryption,如何创建JWKS公钥/私钥对,类似于可在中手动创建的公钥/私钥对,其中包括密钥ID(kid)和密钥使用(使用)?我使用cryptography模块生成RSA密钥对,并使用python jose将密钥提取为JWK,但创建的密钥不包括kid和use(毫不奇怪,因为它们没有在任何地方指定) 代码: 从cryptography.hazmat.backends导入默认\u后端 从cryptography.hazmat.primitives导入序列化 来自cryptography.hazmat.primit

如何创建JWKS公钥/私钥对,类似于可在中手动创建的公钥/私钥对,其中包括密钥ID
kid
)和密钥使用(
使用
)?我使用
cryptography
模块生成RSA密钥对,并使用
python jose
将密钥提取为JWK,但创建的密钥不包括
kid
use
(毫不奇怪,因为它们没有在任何地方指定)

代码:

从cryptography.hazmat.backends导入默认\u后端
从cryptography.hazmat.primitives导入序列化
来自cryptography.hazmat.primitives.不对称导入rsa
​
来自jose import jwk,常数
导入json
​
key=rsa.generate_private_密钥(
公共指数=65537,
密钥大小=2048,
backend=默认值_backend()
)
public\u key=key.public\u key().public\u字节(
encoding=serialization.encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
private\u key=key.private\u字节(
encoding=serialization.encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
加密算法=序列化.NoEncryption()
)
​
打印(json.dumps(jwk.RSAKey(algorithm=constants.Algorithms.RS256,key=public_-key.decode('utf-8'))。到_dict())
打印(json.dumps(jwk.RSAKey(algorithm=constants.Algorithms.RS256,key=private\u key.decode('utf-8'))。到\u dict()
由上述代码段生成的公钥(无
kid
use
properties):


我相信
kid
只是一段元数据(任何字符串),在生成密钥的过程中没有被使用

使用
的情况下,它可能有些相似,但取决于您希望使用不同的非对称加密方案(您可以参考最著名的非对称加密系统,了解加密和签名方案的描述)


总之,您很可能可以根据上述信息重新创建JSON的确切结构,向JSON dict添加适当的密钥。

使用
jwcrypto
库生成JWKS公钥/私钥对的另一种方法:

从jwcrypto导入jwk
key=jwk.jwk.generate(kty='RSA',size=2048,alg='RSA-OAEP-256',use='enc',kid='12345')
public\u key=key.export\u public()
private\u key=key.export\u private()
由上述代码段生成的公钥:

{
    "kty": "RSA",
    "alg": "RSA-OAEP-256",
    "kid": "12345",
    "use": "enc",
    "e": "AQAB",
    "n": "0YclBn...vV7y7w"
}

你分发私钥-然后它就不再是私钥了。签名是用私钥创建的,并用公钥验证。那么,您如何描述RSA(例如,从应用程序中的名称到签名)呢?您是否将私钥用于公钥,反之亦然?这有助于理解你的意思吗?不确定你在问什么,但关于签名的部分也在维基百科中Article@jps这是正确的。你用你的私钥对数据签名,其他人用你的公钥验证签名。我根据评论修改了答案。我不明白你为什么投反对票?
{
    "kty": "RSA",
    "alg": "RSA-OAEP-256",
    "kid": "12345",
    "use": "enc",
    "e": "AQAB",
    "n": "0YclBn...vV7y7w"
}