【问题标题】:Boto [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed while connecting to S3Boto [SSL: CERTIFICATE_VERIFY_FAILED] 连接到 S3 时证书验证失败
【发布时间】:2015-03-22 19:23:03
【问题描述】:

我正在尝试使用 boto 连接到 S3,但它似乎失败了。我尝试了一些解决方法,但它们似乎不起作用。谁能帮我解决这个问题。下面是代码。

import boto

if not boto.config.has_section('Credentials'):
    boto.config.add_section('Credentials')
boto.config.set('Credentials', 'aws_access_key_id', AWS_KEY)
boto.config.set('Credentials', 'aws_secret_access_key', AWS_SECRET_KEY)
if not boto.config.has_section('Boto'):
    boto.config.add_section('Boto')
    boto.config.set('Boto', 'https_validate_certificates', 'False')
    boto.config.add_section('aws info')
    boto.config.set('aws info','aws_validate_certs','False')



s3 = boto.connect_s3(validate_certs=False)
bucket = s3.get_bucket(Bucket_NAME)

【问题讨论】:

    标签: python amazon-web-services amazon-s3 amazon boto


    【解决方案1】:

    可能您的存储桶名称包含一个点,这就是 ssl 证书验证失败的原因。这是一个非常常见的问题,例如,请参见 github issue

    不要使用不安全的连接 (is_secure=False),而是使用 OrdinaryCallingFormat

    import boto
    conn = boto.s3.connect_to_region('eu-west-1', calling_format=boto.s3.connection.OrdinaryCallingFormat())
    bucket = conn.get_bucket(your_bucket)
    

    您可能需要更新您的AWS Region,例如us-east-1

    【讨论】:

      【解决方案2】:

      在 boto3 中,如果您使用的是 s3 客户端,请在创建 s3 客户端时使用 verify=False。 例如:

      s3 = boto3.client('s3', verify=False)
      

      如 boto3 文档中所述,这只会关闭 SSL 证书的验证。仍将使用 SSL(除非 use_ssl 为 False),但不会验证 SSL 证书。

      https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html

      【讨论】:

      • 此解决方案不安全,仅应在另一侧的证书无效且对此无能为力的情况下使用。
      • 这对于使用带有localstack docker(自签名证书)的boto3 很有用
      【解决方案3】:

      我找到了办法,

      connect_s3() 中使用了is_secure=False

      【讨论】:

      • 这是一种解决方法,但真正的问题是亚马逊对子域使用无效证书。
      • 谢谢@Siddarth:那里有很多不起作用的解决方案。我要补充一点,validate_certs=False 没有做任何事情(无论如何都没有记录它的行为,比如is_secure 的行为:boto.readthedocs.org/en/latest/ref/…)。
      • 是的@EOL 在我最终找到正确的解决方案之前,我必须检查所有无效的解决方案。很沮丧。
      【解决方案4】:

      我也遇到过这个问题。我的环境是 Ubuntu 15.04、Python 2.7.9 和 Boto 2.38.0。

      设置参数 validate_certs=False 不会使其与没有有效证书的 HTTPS 连接一起使用。看了boto的代码,发现是Python的ssl模块的一种行为。然后我在这里找到了解决方案:"SSL: CERTIFICATE_VERIFY_FAILED" Error。该解决方案确实有效!!!。

      【讨论】:

      • 谢谢,是的,猴子补丁解决方案适用于 python3 和旧 boto:import ssl ssl._create_default_https_context = ssl._create_unverified_context
      • 感谢你们俩。我只是想注意,在 boto 包中的this 行之后,我必须添加ssl._create_default_https_context = ssl._create_unverified_context
      【解决方案5】:

      添加验证=假

      boto3.resource(
                  "s3",
                  endpoint_url=<URL>,
                  aws_access_key_id=<ID>,
                  aws_secret_access_key=<Key>,
                  verify=False
              )
      

      【讨论】:

      • 这对 boto3 来说很好,但似乎他们正在使用旧的 bo​​to (2)。
      【解决方案6】:

      macOS 用户:如果您使用的是来自 python.org 的 Python 3.6 本页链接的二进制安装程序,请仔细阅读 安装过程中显示的重要信息;这条信息 安装后也可以点击 /应用程序/Python 3.6/ReadMe.rtf。有重要信息 关于 3.6.0 安装程序提供的 Python 的更改, 特别是在 SSL 证书验证方面。

      https://www.python.org/downloads/release/python-360/

      在撰写本文时来自 ReadMe.rtf:

      证书验证和 OpenSSL

      新功能 这个 Python 3.6 变体现在包括它自己的 OpenSSL 1.0.2 私有副本。与以前的版本不同,已弃用的 不再使用 Apple 提供的 OpenSSL 库。这也意味着 系统和用户钥匙串中的信任证书由 Keychain Access 应用程序和安全命令行实用程序 Python ssl 模块不再将其用作默认值。对于 3.6.0,一个 示例命令脚本包含在 /Applications/Python 3.6 中以 从 第三方证书包 (https://pypi.python.org/pypi/certifi)。 如果您选择使用 certifi,则应考虑订阅 项目的电子邮件更新服务在证书时得到通知 捆绑包已更新。

      Python 3.6 安装程序附带的捆绑 pip 有自己的 用于验证下载连接的默认证书存储。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-28
        • 2021-10-08
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 2017-06-01
        • 2017-02-05
        相关资源
        最近更新 更多