Python请求抛出SSLE

2020-12-04 15:43:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的脚本,其中包括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
3条回答
网友
1楼 ·

要使用的CA文件名可以通过verify传递:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

如果使用verify=True,则requests使用自己的CA集,该CA集可能没有签署服务器证书的CA。

网友
2楼 ·

您遇到的问题是由不受信任的SSL证书引起的。

像前面的注释中提到的@dirk一样,最快的修正是设置verify=False

requests.get('https://example.com', verify=False)

请注意,这将导致证书无法验证。这将使您的应用程序面临安全风险,例如中间人攻击。

当然,运用判断。正如评论中提到的,这个对于快速/一次性应用程序/脚本,是可以接受的,但实际上不应该转到生产软件

如果仅跳过证书检查在您的特定上下文中是不可接受的,请考虑以下选项,最好的选项是将verify参数设置为一个字符串,该字符串是证书的.pem文件的路径(您应该通过某种安全方式获得该文件)。

因此,从2.0版开始,verify参数接受以下值,并使用它们各自的语义:

  • True:根据库自己的受信任证书颁发机构验证证书(注意:您可以通过Certifi库查看哪些根证书请求使用,Certifi库是从请求中提取的RCs的信任数据库:Certifi - Trust Database for Humans)。
  • False:完全忽略证书验证。
  • 用于验证证书的请求的CA_捆绑包文件的路径。

来源:Requests - SSL Cert Verification

还要查看同一链接上的cert参数。

网友
3楼 ·

来自请求documentation on SSL verification

Requests can verify SSL certificates for HTTPS requests, just like a web browser. To check a host’s SSL certificate, you can use the verify argument:

>>> requests.get('https://kennethreitz.com', verify=True)

如果不想验证SSL证书,请将verify=False

相关问题