【问题标题】:Is it possible to make boto3 ignore signature expired error?是否可以让 boto3 忽略签名过期错误?
【发布时间】:2018-02-06 02:36:56
【问题描述】:

我正在测试一个使用 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,因为测试使用的模拟数据是静态的。

我确实对错误进行了一些研究,并找到了this answer post。基本上,它是说 AWS 在创建签名后的短时间内使签名无效。据我了解,在我的情况下,由于使用了“freeze_time”,签名被标记为在 20160915 创建,但 AWS 使用当前时间(测试运行的时间)。因此,AWS 认为这个签名已经过期将近一年,并返回错误消息。

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

如果我没有清楚地解释我的问题,请告诉我。任何想法都表示赞赏。

【问题讨论】:

    标签: amazon-web-services boto3


    【解决方案1】:

    AWS API 调用使用时间戳来防止重放攻击。如果您的计算机时间/日期与实际时间相差太大,则 API 调用将被拒绝。

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

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

    【讨论】:

    • 感谢您的信息和建议 :) 我确实找到了一种方法,可以在尝试访问 dynamodb 时更改时间。
    【解决方案2】:

    有什么方法可以让 AWS 忽略该错误?

    没有

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

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

    【讨论】:

    • 感谢您的信息和建议 :) 我确实找到了一种方法,可以在尝试访问 dynamodb 时更改时间。
    【解决方案3】:

    刚刚遇到immobilus 的类似问题。我的解决方案是按照 Antonio 的建议,将 botocore.auth 中的 datetime 替换为非模拟版本。

    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
    

    【讨论】:

    • 郑重声明,从 freezegun 切换到 immobilus 是因为 freezegun 有很长时间的performance issue
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多