一个关于python requests 和SSL证书的问题?

上GitHub和S.O.找了一会儿没有找到,

有点不好意思上知乎提问-_-

如图,python代码如下:

import requests

requests.get(https://www.zhihu.com/"")

然后报错:

requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

请问是什么问题,希望不吝赐教。

对了,python版本 2.7


这个问题我在这里有回答:如何用 python 爬虫翻墙爬取墙外的网站,特别是全站https的,如facebook等? - 刘奕聪的回答

没想到问题被删,放这里做存档。

---------- 原答案 ----------

谢邀。

这个问题也是个大坑,Python2 不支持 SNI,不过具体原因我没有去研究,希望有壮士出来解释。

解决的办法有两个,最简单的就是关闭校验:

response = requests.get(url, verify=False)

如果想让 Python2 支持 SNI 功能,需要以下方法:

使用 pip 安装以下依赖:

  • pyOpenSSL == 0.13

  • ndg-httpsclient == 0.3.2

  • pyasn1 == 0.1.6

然后在使用 urllib3 之前的代码中(即在使用 requests 之前),注入以下代码:

import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()


1.首先运行python的时候关闭Fiddler这个软件,开启它之后运行python会自动改变端口,造成ssl错误。

2.然后添加一下这条:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

3.以上适用python3


sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28

可能会有用

ssl - Python Requests throwing up SSLError


pyopenssl对SNI问题加了猴子补丁,requests明明将pyopenssl集成到本地包了,但不清楚为什么没有提供默认检查或者提供相关的hook操作入口,其实pyopenssl上有解决说明


import requests
requests.get("https://www.zhihu.com/",verify=False)

暂时的一个解决办法。。


解决了,requests.post("https://www.zhihu.com/",verify=False)


推薦閱讀:

TAG:Python | 程序 | Python库 | Python开发 | requests |