当我使用 python boto 连接到 aws ec2 时,它显示 SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify fai

Posted

技术标签:

【中文标题】当我使用 python boto 连接到 aws ec2 时,它显示 SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)【英文标题】:When I use python boto connect to aws ec2 , it show SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) 【发布时间】:2018-08-11 09:55:43 【问题描述】:

我使用的是 Windows 10 操作系统。

我要统计AWS的IP地址个数。

我使用python 2.7.14boto 2.6.0

我添加了一个名为 boto.config 的文件找到 C:\Users\Administrator 文件夹

boto.config的内容是:

[Credentials]

aws_access_key_id=******

aws_secret_access_key=*****

脚本是:

#!/usr/bin/env python

# -*- encoding: utf8 -*-

import boto.ec2

from pprint import pprint

import ssh

import requests

import urllib3

import certifi

import ssl

conn = boto.ec2.connect_to_region('cn-north-1')

reservations = conn.get_all_instances()

InstanceMap=[]

for reservation in reservations:

    for instance in reservation.instances:

        if 'env' in instance.tags and instance.tags['env'] == 'test':

            InstanceMap.append(instance.ip_address)

f = open('F:\ip.txt','w')

pprint(InstanceMap, f)

当我运行这个脚本时,它会显示错误信息:

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:661)

有什么方法可以解决这个问题?

【问题讨论】:

Boto [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed while connecting to S3的可能重复 ***.com/questions/28115250/… 。我的问题不同。 【参考方案1】:

我在Windows 10 机器上遇到了与boto3Python 3.7 相同的问题。事实证明,由于我使用的是安装了代理的公司设备,*.amazonaws.com 证书被代理证书取代。此代理证书链需要被 Python certifi 模块信任。不管你有没有代理,下面的方法应该可以解决SSL: CERTIFICATE_VERIFY_FAILED 错误。

这是我为解决问题所做的 -

    找到cacert.pem所在的路径-

如果没有,请安装证书。命令:pip install certifi

import certifi
certifi.where()
C:\\Users\\[UserID]\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages\\certifi\\cacert.pem

    AWS_CA_BUNDLE环境变量设置为cacert.pem路径-

    AWS_CA_BUNDLE=C:\Users\[UserID]\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\certifi\cacert.pem

    从 amazonaws.com URL 下载证书链。例如:在浏览器上转到https://sts.amazonaws.com/xyz 并导出Root、所有中间证书、域证书并保存为base64 编码的.cer 文件。在记事本中打开证书,复制所有内容。

    现在在记事本中打开 cacert.pem,然后在末尾添加每个下载的证书内容 (---Begin Certificate--- *** ---End Certificate---)。

重启命令行提示符或PowerShell,SSL验证错误应该解决了。

请勿在您的组织环境中使用is_secure = False。这实际上是在禁用 SSL 验证。

【讨论】:

【参考方案2】:

尝试像下面这样添加is_secure = False,以跳过ssl验证,

conn = boto.ec2.connect_to_region('cn-north-1',is_secure=False)

尝试这样提供凭据,这样您就可以知道 boto 配置中的密钥是否是旧的,如果这有效,如果这返回相同的问题,那么您需要在 aws 上检查您的 api-key 和 secret。

API_KEY = 'Actual API_KEY'
API_SECRET = 'Actual Secret'
conn = boto.ec2.connect_to_region('us-east-2',aws_access_key_id=API_KEY,aws_secret_access_key=API_SECRET,is_secure=False)

【讨论】:

当我添加“is_secure = False”时,错误显示:conn = boto.ec2.connect_to_region('cn-north-1',is_secure=False) File "C:\Python27\lib\ site-packages\boto-2.6.0- EC2ResponseError: EC2ResponseError: 401 Unauthorized AuthFailure AWS 无法验证提供的访问凭证********************** ****** 嗨@Andrew 我已经编辑了答案以帮助您验证您的密钥。希望有帮助 Omi Harjani,非常感谢,这会返回相同的问题。我会检查我的 api-key Omi Harjani,我检查了我的 api-key 和 secret 。这是正确的 。这需要让我的access_key_id和secret_id对应的用户给予相应的权限吗?目前此账号为管理员权限。 我解决了这个问题。这个问题的原因: EC2ResponseError: EC2ResponseError: 401 Unauthorized 。这是IAM的角色没有足够的权限。我换了另一个 IAM 角色,现在可以了。

以上是关于当我使用 python boto 连接到 aws ec2 时,它显示 SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify fai的主要内容,如果未能解决你的问题,请参考以下文章

通过代理的 Python Boto S3Connection 问题

如何在 Python 中使用 JDBC 驱动程序和 Boto3 API 连接到现有的 Redshift 数据库

使用boto3 Python SDK返回AWS EC2可用性区域属性

如何使用 boto3 从连接到 ECS 任务的网络接口获取公共 IP

Boto3 AWS KMS 加密解密文件

获取VS代码Python扩展以连接到远程AWS EMR主节点上运行的Jupyter。