我使用AWS非对称ECC (ES256)密钥使用Python3中的API调用对令牌进行签名和验证。响应返回
{
"KeyId": "arn:aws:kms:us-east-1:000000000000:key/1234",
"Signature": "b'0D\\x02 \\x18\\xd9\\x13\\x96\\x9d\\xb00p\\xc9H\\'-\\xc6@{\\xd1V\\xf5\\xeb\\x83\"1\\x0e:\\x98\\xb4\\xea6P\\x0f\\xdf\\x82\\x02 \\x1fPt\\xc0\\x81pB\\xaa\\xe7_\\xf2~\\x91BlU\\x05\\xba1\\xe0\\xfe\\xf6\\xe4\\xebL\\nl\\xfc\\xf8\\xce\\xc6_'",
"SigningAlgorithm": "ECDSA_SHA_256" }
如果我使用AWS,响应“签名”是base64编码的:
{
"KeyId": "arn:aws:kms:us-east-1:000000000000:key/1234",
"Signature": "MEQCIBqjAiAnMKkugooWU6/AqCyfhQUocoiVeIIf8lL2p7YbAiBEJOl2cp9HzQNufiMBezIjZuSGW6ID13l7JSzTgLlv+g==",
"SigningAlgorithm": "ECDSA_SHA_256"
}每当我试图使用base64中的API响应对base64.urlsafe_b64encode(string)编码“签名”时,我都无法验证签名。下面是我收到的错误的一个例子:
调用验证操作时发生错误(InvalidKeyUsageException):asn1:结构错误:标记不匹配(16 vs {class:1标记:2长度:39 isCompound:true}) {可选:假显式:假应用程序:假私有:假defaultValue:标记:字符串类型:0 timeType:0 set:false omitEmpty:false} ecdsaSignature @2
我如何对从base64返回的“签名”字节字符串进行编码,并且仍然能够进行验证?
更新:
如果我更新到base64.b4encode而不是base64.urlsafe_encode,结果是相同的:
def _sign_token(self, key_id, message):
signature = kms_client.sign(
KeyId=key_id,
Message=message,
MessageType="RAW",
SigningAlgorithm="ECDSA_SHA_256",
)
logger.log(msg=signature, level=cl.log_level)
return base64.b64encode(signature["Signature"]).decode()日志消息返回:
"arn:aws:kms:us-east-1:000000000000:key/309d8dc5-409e-4f57-96a8-c71223c84dc2",{“上升时间”:"2021-04-03 19:40:27,593",“级别名称”:"INFO","name":"util.sign","lineno":214,“
”:null,"env":"local","KeyId":“签名”:"b'0E\x02!\x00\xcc\x82\xf4$@?\x9e\n\xd7$\x94\x9f.\x1d5\x19{W\x1e\xcff\x8b&\xf0\xef\x88\xcf^"\xf6\xa4\x1b\x02 \x0c\x18\xab?\x93\xd5\x88Cx\xf6\x0c\x1b\xcf\xd9\xd9\xd2\xd4"\xcf\x94\xede_>\x8c\x01~J\xea\x0ezB'","SigningAlgorithm":"ECDSA_SHA_256“"ResponseMetadata":{"HTTPStatusCode":200,"HTTPHeaders":{“HTTPHeaders-type”:"application/x-amz-json-1.1",“内容-长度”:"233",“连接”:“关闭”,“访问-控制-允许-原产地”:"*",“访问-控制-允许-允许-方法”:“头、获取、放置、张贴、删除、选项、补丁”、“访问-控制-允许-标题”:“授权、内容-类型、内容-长度,内容-md5,缓存-控制,x-amz-内容-sha256,x-amz-日期,x-amz-安全性-令牌,x-amz-用户-代理,x-amz-目标,x-amz-acl,x-amz-版本-id,x-local堆栈-目标,x-amz-标记“,”访问控制-公开-头“:”x-amz-版本-id“,”日期“:"Sat,03 4月2021 19:40:27 GMT","server":”hypercor-h11“},"RetryAttempts":0}
验证错误:
"stacktrace":“调用验证操作时发生了错误(InvalidKeyUsageException):asn1:结构错误:标记不匹配(16 vs {class:1标记:13长度:69 isCompound:false}) {可选:假显式:假应用程序:假私有:假defaultValue:标记:asn1类型:0 timeType:0 set:false } ecdsaSignature @2”
def _verify_signature(self, key_id, message, signature):
response = kms_client.verify(
KeyId=key_id,
Message=message,
MessageType="RAW",
Signature=signature,
SigningAlgorithm="ECDSA_SHA_256",
)
logger.log(msg=response, level=cl.log_level)
return responseclient.verify要求签名为字节https://boto3.amazonaws.com/v1/documentation/api/1.11.4/reference/services/kms.html#KMS.Client.verify
如果我不使用.encode(),就会得到相同的结果:
"stacktrace":“调用验证操作时发生了错误(InvalidKeyUsageException):asn1:结构错误:标记不匹配(16 vs {class:1标记:13长度:69 isCompound:false}) {可选:假显式:假应用程序:假私有:假defaultValue:标记:asn1类型:0 timeType:0 set:false } ecdsaSignature @2”
def _sign_token(self, key_id, message):
signature = kms_client.sign(
KeyId=key_id,
Message=message,
MessageType="RAW",
SigningAlgorithm="ECDSA_SHA_256",
)
logger.log(msg=signature, level=cl.log_level)
return base64.b64encode(signature["Signature"])注意:
如果我将client.sign响应“签名”传递给没有base64编码的client.verify,则验证通过.。
发布于 2021-04-03 19:51:27
由AWS cli编码的字符串不是base64 64编码!它使用标准的base64 (即base64.b64encode )进行编码。
标准base64编码使用三种元字符/、+和=。/和+在路径或查询字符串中都不安全,而URL安全编码分别用_和-替换了这两种编码。由于/和+存在于AWS编码字符串中,因此可以推断它使用的是标准base64编码,而不是URL安全编码。
bytes对象是base64.b64encode的返回值。通常,Base-64编码用于将二进制代码编码为文本。要将值作为文本获得,则需要将其作为decode (例如,将UTF-8转换为unicode字符串):
base64_encoded_as_str = base64.b64encode(binary_value).decode()发布于 2021-04-07 17:20:56
AWS的支持过程起了作用。结果发现,当我试图验证而不是decode()时,我正在对base64编码的签名执行base64.b64decode()操作。
https://stackoverflow.com/questions/66935193
复制相似问题