通过python进行请求时出现SSL证书错误

Posted

技术标签:

【中文标题】通过python进行请求时出现SSL证书错误【英文标题】:SSL Certificate error while doing a request via python 【发布时间】:2018-03-25 11:02:34 【问题描述】:

我正在尝试对 HTTPS 网址进行 API 调用:

response = requests.request("GET", url, headers=headers, params=None, verify=True)

我面临以下错误。当我通过 cUrl 或 Postman 调用 API 时,它工作正常...

Traceback(最近一次调用最后):文件“C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py”, 第 601 行,在 urlopen 中 chunked=chunked) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py", 第 346 行,在 _make_request self._validate_conn(conn) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py", 第 850 行,在 _validate_conn 中 conn.connect() 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connection.py", 第 326 行,连接中 ssl_context=context) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\util\ssl_.py", 第 329 行,在 ssl_wrap_socket 返回 context.wrap_socket(sock, server_hostname=server_hostname) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\contrib\pyopenssl.py", 第 448 行,在 wrap_socket 中 raise ssl.SSLError('bad handshake: %r' % e) ssl.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', '证书验证失败')],)",)

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\requests\adapters.py", 第 440 行,在发送中 超时=超时文件“C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py”, 第 639 行,在 urlopen 中 _stacktrace=sys.exc_info()[2]) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\util\retry.py", 第 388 行,增量 raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(主机='freshdesk.freshsales.io',端口=443):最大 url 超出重试次数: /api/sales_accounts/1000080286/conversations.json?include=email_conversation_recipients,all,targetable,phone_numbe,phone_calle,note,user (由 SSLError(SSLError(“错误握手:错误([('SSL 例程', 'tls_process_server_certificate', '证书验证 失败')],)",),))

我尝试指定 verify=False 。仍然有错误

C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning:正在发出未经验证的 HTTPS 请求。添加 强烈建议进行证书验证。看: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) Traceback(最近一次调用最后一次):文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\contrib\pyopenssl.py", 第 441 行,在 wrap_socket cnx.do_handshake() 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\OpenSSL\SSL.py", 第 1716 行,在 do_handshake 中 self._raise_ssl_error(self._ssl, 结果) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\OpenSSL\SSL.py", 第 1456 行,在 _raise_ssl_error _raise_current_error() 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\OpenSSL_util.py", 第 54 行,在 exception_from_error_queue 中 raise exception_type(errors) OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify 失败')]

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py", 第 601 行,在 urlopen 中 chunked=chunked) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py", 第 346 行,在 _make_request self._validate_conn(conn) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connectionpool.py", 第 850 行,在 _validate_conn 中 conn.connect() 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\connection.py", 第 326 行,连接中 ssl_context=context) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\util\ssl_.py", 第 329 行,在 ssl_wrap_socket 返回 context.wrap_socket(sock, server_hostname=server_hostname) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\urllib3\contrib\pyopenssl.py", 第 448 行,在 wrap_socket 中 raise ssl.SSLError('bad handshake: %r' % e) ssl.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', '证书验证失败')],)",)

关于如何规避此错误的任何想法?我在这里浏览了各种问题,但找不到解决方案。 URL 管理员还确认服务器证书是有效的,所以我觉得这肯定与一些冲突的软件包安装有关。

这是我的 pip 冻结列表:

C:\Users\user\python>pip freeze
asn1crypto==0.23.0
attrs==16.3.0
Automat==0.5.0
beautifulsoup4==4.5.3
bleach==1.5.0
bs4==0.0.1
certifi==2017.7.27.1
cffi==1.11.2
chardet==3.0.4
chargebee==2.1.8
colorama==0.3.7
constantly==15.1.0
cryptography==2.1.1
cssselect==1.0.1
decorator==4.0.11
entrypoints==0.2.2
html5lib==0.9999999
idna==2.6
incremental==16.10.1
ipykernel==4.5.2
ipython==5.3.0
ipython-genutils==0.1.0
ipywidgets==5.2.2
Jinja2==2.9.5
jsonschema==2.6.0
jupyter==1.0.0
jupyter-client==5.0.0
jupyter-console==5.1.0
jupyter-core==4.3.0
lxml==3.7.3
MarkupSafe==0.23
mistune==0.7.3
nbconvert==5.1.1
nbformat==4.3.0
notebook==4.4.1
numpy==1.12.0
pandas==0.19.2
pandocfilters==1.4.1
parsel==1.1.0
pickleshare==0.7.4
prompt-toolkit==1.0.13
pyasn1==0.2.3
pyasn1-modules==0.0.8
pycparser==2.18
PyDispatcher==2.0.5
Pygments==2.2.0
PyJWT==1.5.0
pyOpenSSL==17.3.0
PySocks==1.6.7
python-dateutil==2.6.0
pytz==2016.10
pyzmq==16.0.2
qtconsole==4.2.1
queuelib==1.4.2
requests==2.18.4
selenium==3.0.2
service-identity==16.0.0
simplegeneric==0.8.1
six==1.11.0
testpath==0.3
tornado==4.4.2
traitlets==4.3.2
twilio==6.0.0
urllib3==1.22
w3lib==1.17.0
wcwidth==0.1.7
widgetsnbextension==1.2.6
win-unicode-console==0.5
zope.interface==4.3.3

【问题讨论】:

【参考方案1】:

最后发现是网络问题。与我公司的 IT 团队一起解决了这个问题,他们通过一些 IP 白名单解决了这个问题。

【讨论】:

以上是关于通过python进行请求时出现SSL证书错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Kubernetes 集群上对 AutoDesk-Forge 进行身份验证时出现 SSL 证书错误

使用python urllib时出现[SSL: CERTIFICATE_VERIFY_FAILED]报错的解决方案

在 android Nougat 中使用自签名证书通过 https 连接时出现 SSL 握手异常

使用 TortoiseGit 创建 git clone 时出现 SSL 证书问题

创建Octopus包时出现SSL证书错误

使用 SSL 与远程数据库的 PDO 连接;验证服务器证书时出现 FastCGI 错误