当我使用 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.14
和boto 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
机器上遇到了与boto3
和Python 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 UnauthorizedAuthFailure
以上是关于当我使用 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可用性区域属性