是否可以使boto3忽略签名过期错误



我正在测试一个使用boto3访问DynamoDB的Python应用程序,从boto3收到了以下错误消息。

{'error': 
{'Message': u'Signature expired: 20160915T000000Z is now earlier than 20170828T180022Z (20170828T181522Z - 15 min.)', 
'Code': u'InvalidSignatureException'}}

我注意到这是因为我使用python包"freezegun.free_time"将时间冻结在20160915,因为测试使用的模拟数据是静态的。

我确实研究了一下这个错误,我找到了这个答案贴。基本上,这是说AWS在创建签名后的短时间内使其无效。据我所知,在我的情况下,由于使用了"冷冻时间",签名被标记为在20160915创建,但AWS使用当前时间(测试运行的时间(。因此,AWS认为该签名已过期近一年,并发回错误消息。

有什么方法可以让AWS忽略这个错误吗?或者可以使用boto3手动修改创建签名的日期和时间吗?

如果我没有把问题解释清楚,请告诉我。欢迎提出任何想法。

AWS API调用使用时间戳来防止重放攻击。如果您的计算机时间/日期偏离实际时间太远,那么API调用将被拒绝。

从日期设置为2016的计算机运行请求肯定会引发这种失败情况。

检查是在主机端完成的,因此除了使用真实日期(或以某种方式迫使Python使用与系统其他部分不同的日期(之外,您无法在本地修复任何问题。

刚刚在不动产方面遇到了类似的问题。我的解决方案是将botocore.auth中的datetime替换为未锁定的版本,正如Antonio所建议的那样。

pytest示例看起来像这个

import types
from immobilus import logic
@pytest.fixture(scope='session', autouse=True)
def _boto_real_time():
from botocore import auth
auth.datetime = get_original_datetime()
def get_original_datetime():
original_datetime = types.ModuleType('datetime')
original_datetime.mktime = logic.original_mktime
original_datetime.date = logic.original_time
original_datetime.gmtime = logic.original_gmtime
original_datetime.localtime = logic.original_localtime
original_datetime.strftime = logic.original_strftime
original_datetime.date = logic.original_date
original_datetime.datetime = logic.original_datetime
return original_datetime

有什么方法可以让AWS忽略这个错误吗?

或者是否可以使用boto3手动修改创建签名的日期和时间?

您应该修补botocore库的auth.py文件中的任何datetime/time调用(来源:https://github.com/boto/botocore/blob/develop/botocore/auth.py)。

最新更新