Ted*_*ows 309 python ssl urllib3 python-requests
我正在编写一个涉及CAS,jspring安全检查,重定向等的简单脚本.我想使用Kenneth Reitz的python请求,因为它是一项很棒的工作!但是,CAS需要通过SSL进行验证,因此我必须先通过该步骤.我不知道Python的要求是什么?这个SSL证书应该驻留在哪里?
Traceback (most recent call last):
File "./test.py", line 24, in <module>
response = requests.get(url1, headers=headers)
File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request
File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Run Code Online (Sandbox Code Playgroud)
Raf*_*ida 402
您遇到的问题是由不受信任的SSL证书引起的.
像之前评论中提到的@dirk一样,最快的修复是设置verify=False
:
requests.get('https://example.com', verify=False)
Run Code Online (Sandbox Code Playgroud)
请注意,这将导致证书无法验证.这将使您的应用程序面临安全风险,例如中间人攻击.
当然,应用判断.正如评论中所提到的,这对于快速/一次性应用程序/脚本来说可能是可以接受的,但实际上不应该转到生产软件.
如果仅在特定上下文中跳过证书检查是不可接受的,请考虑以下选项,最佳选择是将verify
参数设置为字符串,该字符串是.pem
证书文件的路径(您应该通过某种安全方式获取该文件的路径)手段).
因此,从版本2.0开始,该verify
参数接受以下值及其各自的语义:
True
:使证书针对库自己的可信证书颁发机构进行验证(注意:您可以通过Certifi库查看哪些根证书请求使用,证书库是从请求中提取的RC信任数据库:Certifi - 人类信任数据库).False
:完全绕过证书验证.来源:请求 - SSL证书验证
另请查看cert
同一链接上的参数.
Bou*_*oud 105
来自请求SSL验证的文档:
请求可以验证HTTPS请求的SSL证书,就像Web浏览器一样.要检查主机的SSL证书,可以使用verify参数:
>>> requests.get('https://kennethreitz.com', verify=True)
Run Code Online (Sandbox Code Playgroud)
如果您不想验证您的SSL证书,请制作 verify=False
jfs*_*jfs 50
要使用的CA文件的名称可以通过verify
:
cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
Run Code Online (Sandbox Code Playgroud)
如果您使用,verify=True
则requests
使用其自己的CA集,该CA集可能没有签署服务器证书的CA.
ala*_*jds 38
$ pip install -U requests[security]
当这个问题被打开时(2012-05),请求版本是0.13.1.在版本2.4.1(2014-09)中,使用certifi
包(如果可用)引入了"安全性"附加功能.
现在(2016-09)主版本是2.11.1,没有 合适的版本verify=False
.requests.get(url, verify=False)
如果安装requests[security]
附加功能,则无需使用.
小智 31
我在使用aws boto3时遇到了同样的问题和ssl证书验证失败问题,通过查看boto3代码,我发现REQUESTS_CA_BUNDLE
没有设置,所以我通过手动设置修复了这两个问题:
from boto3.session import Session
import os
# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
'/etc/ssl/certs/',
'ca-certificates.crt')
# centos
# 'ca-bundle.crt')
Run Code Online (Sandbox Code Playgroud)
对于aws-cli,我猜设置REQUESTS_CA_BUNDLE ~/.bashrc
将解决这个问题(未经测试,因为我的aws-cli无需工作).
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
Run Code Online (Sandbox Code Playgroud)
tin*_*tin 18
如果你有一个依赖的库requests
而你无法修改验证路径(比如pyvmomi
),那么你必须找到cacert.pem
捆绑的请求并将你的CA附加到那里.以下是查找cacert.pem
位置的通用方法:
视窗
C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
Run Code Online (Sandbox Code Playgroud)
Linux的
# (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem
# (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
Run Code Online (Sandbox Code Playgroud)
顺便说一句.@ requests-devs,将你自己的cacerts与请求捆绑在一起真的非常烦人......尤其是你似乎没有先使用系统ca存储这一事实,这在任何地方都没有记录.
更新
在您使用库并且无法控制ca-bundle位置的情况下,您还可以将ca-bundle位置明确设置为主机范围的ca-bundle:
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)"
Run Code Online (Sandbox Code Playgroud)
use*_*581 14
我使用gspread面临同样的问题,这些命令对我有用:
sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28
Run Code Online (Sandbox Code Playgroud)
Ani*_*ole 12
如果要删除警告,请使用以下代码.
import urllib3
urllib3.disable_warnings()
Run Code Online (Sandbox Code Playgroud)
和verify=False
与request.get
或post
方法
chk*_*chk 11
我找到了解决类似问题的具体方法.这个想法指向存储在系统中的cacert文件,并由另一个基于ssl的应用程序使用.
在Debian中(我不确定在其他发行版中是否相同)证书文件(.pem)存储在/etc/ssl/certs/
So中,这是适合我的代码:
import requests
verify='/etc/ssl/certs/cacert.org.pem'
response = requests.get('https://lists.cacert.org', verify=verify)
Run Code Online (Sandbox Code Playgroud)
为了猜测pem
选择哪个文件,我浏览到了url并检查哪个证书颁发机构(CA)已生成证书.
编辑:如果你不能编辑代码(因为你正在运行第三个应用程序),你可以尝试pem
直接添加证书/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
(例如将其复制到文件的末尾).
小智 10
正如其他人所指出的,这个问题“是由不受信任的 SSL 证书引起的”。我的回答是基于评分最高的答案和这个答案。
您可以使用curl
以下方法测试证书:
curl -vvI https://example.com
Run Code Online (Sandbox Code Playgroud)
如果返回错误,您有 3 个选择:
curl -vvI https://example.com
Run Code Online (Sandbox Code Playgroud)
requests.get('https://example.com', verify=False)
Run Code Online (Sandbox Code Playgroud)
我的问题是因为我只使用了我网站的证书,而不是中间(又名链)证书。
如果您使用 Let's Encrypt,则应使用该fullchain.pem
文件,而不是cert.pem
.
小智 8
如果你不打扰证书只是使用verify=False
.
import requests
url = "Write your url here"
returnResponse = requests.get(url, verify=False)
Run Code Online (Sandbox Code Playgroud)
经过几个小时的调试后,我只能使用以下包来实现这一点:
requests[security]==2.7.0 # not 2.18.1
cryptography==1.9 # not 2.0
Run Code Online (Sandbox Code Playgroud)
运用 OpenSSL 1.0.2g 1 Mar 2016
没有这些包verify=False
没有工作.
我希望这可以帮助别人.
小智 5
我遇到了同样的问题.事实证明我没有在我的服务器上安装中间证书(只需将其附加到证书的底部,如下所示).
https://www.digicert.com/ssl-support/pem-ssl-creation.htm
确保安装了ca-certificates软件包:
sudo apt-get install ca-certificates
Run Code Online (Sandbox Code Playgroud)
更新时间也可以解决此问题:
sudo apt-get install ntpdate
sudo ntpdate -u ntp.ubuntu.com
Run Code Online (Sandbox Code Playgroud)
如果您使用的是自签名证书,则可能需要手动将其添加到系统中.
如果请求调用隐藏在代码深处并且您不想安装服务器证书,那么仅出于调试目的,可以对请求进行猴子补丁:
import requests.api
import warnings
def requestspatch(method, url, **kwargs):
kwargs['verify'] = False
return _origcall(method, url, **kwargs)
_origcall = requests.api.request
requests.api.request = requestspatch
warnings.warn('Patched requests: SSL verification disabled!')
Run Code Online (Sandbox Code Playgroud)
切勿在生产中使用!
我想参加聚会为时已晚,但我想为像我这样的流浪者粘贴修复程序!所以以下在 Python 3.7.x 上对我有用
在终端中输入以下内容
pip install --upgrade certifi # hold your breath..
Run Code Online (Sandbox Code Playgroud)
再次尝试运行您的脚本/请求,看看它是否有效(我确定它不会被修复!)。如果它不起作用,请尝试直接在终端中运行以下命令
open /Applications/Python\ 3.6/Install\ Certificates.command # please replace 3.6 here with your suitable python version
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
539531 次 |
最近记录: |