我正在测试一个使用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手动修改签名创建的日期和时间?
如果我没有清楚地解释我的问题,请告诉我。任何想法都会受到赞赏。
发布于 2017-08-28 22:53:51
AWS调用使用时间戳来防止重放攻击。如果计算机时间/日期偏离实际时间太远,则API调用将被拒绝。
从设定为2016年的计算机上运行请求肯定会触发这种失败情况。
检查是在主机端完成的,因此除了使用实际日期(或以某种方式强迫Python使用与系统其他部分不同的日期)之外,您无法在本地修复任何问题。
发布于 2018-08-31 14:13:06
不动也遇到了类似的问题。我的解决方案是按照Antonio的建议,将datetime从botocore.auth替换为非模拟版本。
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发布于 2017-08-28 23:01:51
有什么办法让AWS忽略这个错误吗?
不是
或者是否可以使用boto3手动修改签名创建的日期和时间?
您应该修补botocore库的auth.py文件中的任何datetime / time调用(源:https://github.com/boto/botocore/blob/develop/botocore/auth.py)。
https://stackoverflow.com/questions/45925531
复制相似问题