Azure keyvault Python SDK和sign()方法给出'value'的无效长度:44个字节。 ES256需要32个字节,用base64url编码

问题描述 投票:0回答:1

除了我给sign()的数据是32bytes编码urlsafe-base64。不知道他们在哪里得到44。

#!/usr/bin/env python3

from azure.keyvault import KeyVaultClient
from msrestazure.azure_active_directory import MSIAuthentication
from base64 import urlsafe_b64encode
from hashlib import blake2b
from binascii import unhexlify

kvclient = KeyVaultClient(MSIAuthentication(resource='https://vault.azure.net'));
op = urlsafe_b64encode(blake2b(unhexlify('00112233'), digest_size=32).digest())
print(op)
sig = kvclient.sign('https://REDACTED1.vault.azure.net', 'REDACTED2', 'REDACTED3', 'ES256', op)

$ ./aclient.py
b'QO46UZnfhhh93VCTkagtPzWj1Z-4PvmzmKdsmA4fepY='
Traceback (most recent call last):
  File "./aclient.py", line 12, in <module>
    sig = kvclient.sign('https://REDACTED1.vault.azure.net', 'REDACTED2', 'REDACTED3', 'ES256', op)
  File "/home/dev/hsm/lib/python3.6/site-packages/azure/keyvault/v7_0/key_vault_client.py", line 1022, in sign
    raise models.KeyVaultErrorException(self._deserialize, response)
azure.keyvault.v7_0.models.keyvault.v7_0.models.key_vault_error_py3.KeyVaultErrorException: (BadParameter) Invalid length of 'value': 44 bytes. ES256 requires 32 bytes, encoded with base64url.

auth / token通过系统分配的管理标识进行处理 - ES256用于ECC P256密钥签名。 R1是我的keyvault domainhostname,R2是keyname,r3是keyversion。我正在使用Azure SDK for Python - Keyvault的文档。我也试过python的标准base64编码功能代替“urlsafe”,我得到同样的东西。

python azure azure-keyvault
1个回答
0
投票

实际上我相信我已经想到这一点,显然错误消息ES256 requires 32 bytes, encoded with base64url在这里只是一个坏的红鲱鱼,显然只是不适用于SDK,我认为该消息只是支持REST API的标志:

如果你看一下SDK example中的sign()函数,请看第344行。它使用一个名为'digest'的变量作为要传递给sign()函数的值的字节。第337行是创建此摘要的地方,我们都知道这些摘要是32字节二进制类型。

所以尽管有这个错误,这个sign()函数不应该首先对数据进行base64encode。我几乎100%确定错误是否支持REST API,它使用base64encoded字符串来表示要签名的32字节数据,其中base64url字符串的长度最终为44个字符。

`DOH

© www.soinside.com 2019 - 2024. All rights reserved.