从 azure python sdk JWK 生成 jwcrypto JWK

Posted

技术标签:

【中文标题】从 azure python sdk JWK 生成 jwcrypto JWK【英文标题】:Generate jwcrypto JWK from azure python sdk JWK 【发布时间】:2019-07-18 16:54:30 【问题描述】:

我正在使用 azure-sdk 从 Azure Key Vault 获取密钥。这将返回一个 KeyBundle,它有一个 azure.keyvault.v7_0.models.json_web_key_py3.JsonWebKey

类型的 key 属性

对于我的代码的不同部分,我需要从jwcrypto JWK 创建一个签名令牌。 JWT.make_signed_token 方法采用 JsonWebKey。从 Azure 返回的 JsonWebKey(我认为)实际上是同一个类,在不同的包中定义。

有没有办法将 Azure JWK 变成 jwcrypto JWK?我认为可以一个一个地转置所有属性,但想知道是否有更优雅的方式。

编辑:忘记包含版本...

Windows 10 Python 3.6.5 jwcrypto 0.6.0 azure-keyvault 1.1.0 和 azure-mgmt-keyvault 1.1.0

【问题讨论】:

【参考方案1】:

将 Azure JWK 对象转换为 jwcrypto JWK 对象的简单方法如下所示。

import jwcrypto.jwk as jwk

azureJwkObj = .... # your Azure JWK object
azureJwkDict = azureJwkObj.__dict__

jwcryptoJwkObject = jwk.JWK(**azureJwkDict)

下面也一样。

jwcryptoJwkObject = jwk.JWK().import_key(**azureJwkDict)

在我查看了 Azure KeyVault SDK 的源代码和 Python 的 jwcrypto 的源代码后,我认为 jwcrypto.jwk.JWK 的函数 import_key 需要 dict 作为参数来生成 jwcrypto JWK 对象.

根据Azure KeyVault SDK的源代码json_web_key_py3.pyjwcryptojwk.py,我尝试生成一个jwcrypto的JWK对象,通过下面的代码查看其结构。

from jwcrypto import jwk
key = jwk.JWK.generate(kty='oct', size=256)
print(key.__dict__)
# The output is '_params': 'kty': 'oct', '_key': 'k': 'HJUk1CeudZ2Tur0fzHnOi-1U9UjxaUjClRW8TvqFakI', '_unknown': 

然后,我尝试使用下面的代码将 Azure JWK 对象转换为 jwcrypto.jwk.JWK.import_key 所需的字典,以通过 import_key 函数创建 jwcrypto JWK 对象。

import jwcrypto.jwk as jwk

azureJwkObj = .... # your Azure JWK object
azureJwkDict = azureJwkObj.__dict__

_params = k: v for k, v in azureJwkDict.items() if k in jwk.JWKParamsRegistry.keys()
kty = _params.get('kty', None)
_key = k: v for k, v in azureJwkDict.items() if k in jwk.JWKValuesRegistry[kty].keys()

args = '_params': _params, '_key': _key, '_unknown': 

jwcryptoJwkObject = jwk.JWK.import_key(args)

【讨论】:

感谢您的回答 :) 在我运行 import_key 函数之前一切似乎都很好。我得到一个属性错误:File "AppData\Local\Programs\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\jwcrypto\jwk.py", line 365, in import_key kty = self._params.get('kty', None) AttributeError: 'dict' object has no attribute '_params' @EllaP 我不熟悉 ArcGIS 中的 Python 3。您能否发布有关此 Python 的 ArcGIS 的更多信息,例如详细的 Python 版本?此外,您可以发布您的代码和其他有用的东西来帮助我解决这个问题。谢了。 它只是作为 ArcGIS 软件一部分的标准 python 3.6.5 发行版。我使用了像 azureJwkObj = azureKeyVaultClient.get_key(vault_url, key_name, key_version).key 这样的 azure 包,然后复制了您的代码。我得到 args 是字典的字典,它应该是什么类型? @EllaP 根据我的经验,问题不是由代码引起的,而是由您的其他 Python 脚本或环境引起的。请检查您的Python环境,如import sys; print(sys.path),检查是否存在同名脚本文件导致与jwcrypto自己通过pip install jwcrypto安装的名称冲突问题,或者其他原因您可以在Google或Bing中搜索找到出来。 我尝试创建一些示例字典并使用点表示法访问键,但这似乎会产生 AttributeError。我已经查看了一些关于此的 SO 问题(例如 this one ),并将对其进行更多研究。 jwk 的源代码似乎使用了点表示法,我真的不想弄乱它。

以上是关于从 azure python sdk JWK 生成 jwcrypto JWK的主要内容,如果未能解决你的问题,请参考以下文章

Azure python sdk 从虚拟机获取属性

如何从用于 vm 的 Azure Python SDK 获取 OS 磁盘相关的详细信息

Python 中的 Web Crypto API JWK 用法

如何从 RSA 密钥对创建 JWK?

如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS

Azure 存储:如何使用 .NET SDK 生成 SAS 连接字符串