SSL: CERTIFICATE_VERIFY_FAILED"错误

我得到以下错误:

Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in        __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in  run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

下面是导致这个错误的代码:

if input.startswith("!web"):
input = input.replace("!web ", "")
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
info = urllib2.urlopen(req).read()
Message.Chat.SendMessage ("" + info)

我正在使用的API要求我使用HTTPS。我怎样才能让它绕过验证呢?

1024432 次浏览

就像我在注释中写的那样,这个问题可能与这个SO答案有关。

简而言之:有多种方法来验证证书。OpenSSL使用的验证与系统上的受信任根证书不兼容。OpenSSL是Python使用的。

你可以尝试为Verisign三级公共主要认证机构获取缺少的证书,然后根据Python文档使用cafile选项:

urllib2.urlopen(req, cafile="verisign.pem")

如果你只是想绕过验证,你可以创建一个新的SSLContext。默认情况下,新创建的上下文使用CERT_NONE

17.3.7.2.1节所述,要小心

当直接调用SSLContext构造函数时,CERT_NONE是默认值。由于它不验证另一个对等体,因此它可能是不安全的,特别是在客户端模式下,大多数时候您希望确保与之通信的服务器的真实性。因此,在客户端模式下,强烈建议使用CERT_REQUIRED。

但如果你只是想让它现在工作,出于其他原因,你可以执行以下操作,你还必须import ssl:

input = input.replace("!web ", "")
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

这应该绕过你的问题,但你并没有真正解决任何问题,但你不会看到[SSL: CERTIFICATE_VERIFY_FAILED],因为你现在没有验证证书!

为了补充以上内容,如果你想知道更多关于为什么你会看到这些问题,你会想要看看PEP 476

这个PEP建议在默认情况下启用X509证书签名的验证,以及Python的HTTP客户端的主机名验证,并在每次调用的基础上选择退出。此更改将应用于Python 2.7、Python 3.4和Python 3.5。

有一个建议选择退出,这与我上面的建议没有什么不同:

import ssl


# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

它还通过monkeypatching提供了一个非常沮丧选项,这在python中并不常见:

import ssl


ssl._create_default_https_context = ssl._create_unverified_context

它用创建未经验证的上下文的函数覆盖用于创建上下文的默认函数。

请注意PEP中所述:

本指南主要针对希望采用新版本的Python的系统管理员,这些Python在尚不支持HTTPS连接上的证书验证的遗留环境中实现此PEP。例如,管理员可以通过将上面的monkeypatch添加到Python标准操作环境中的sitecustomize.py来选择退出。应用程序和库不应该使这个更改过程变得广泛(可能除了响应系统管理员控制的配置设置)。

如果你想读一篇关于为什么不验证证书在软件你可以在这里找到它中是不好的论文!

像你一样,我在我的旧iMac (OS X 10.6.8)上使用python 2.7,我也遇到了这个问题,使用urllib2。urlopen:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

我的程序运行得很好,没有SSL证书问题,突然(在下载程序后),它们因SSL错误而崩溃。

问题是使用的python版本:

  1. https://www.python.org/downloads和python-2.7.9-macosx10.6.pkg没有问题

  2. 自制工具: "brew install python",版本位于/usr/local/bin。

/Applications/Python 2.7/ReadMe.rtf中有一章叫做Certificate verification and OpenSSL [CHANGED for Python 2.7.9],详细解释了这个问题。

因此,检查,下载并将正确版本的python放入您的PATH中。

在Windows上,Python不会查看系统证书,而是使用位于?\lib\site-packages\certifi\cacert.pem的自己的证书。

问题的解决方案:

  1. 下载“*”格式的域验证证书。CRT或*pem文件
  2. 在编辑器中打开文件并将其内容复制到剪贴板
  3. 找到你的cacert.pem位置:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. 编辑cacert.pem文件,并将您的域验证证书粘贴在文件的末尾。
  5. 保存文件并享受请求!
我羞愧地低下头,因为我也有同样的问题,除了在我的情况下,我点击的URL是有效的,证书是有效的。无效的是我的网络连接。我未能将代理详细信息添加到浏览器(在这种情况下是IE)。这阻止了验证过程的正确进行。
添加了代理的详细信息,我的python非常高兴

如果你在vCenter 6上,你应该将你vCenter的vmware证书颁发机构证书添加到你的操作系统的受信任CA列表中。要下载证书,请执行以下操作

  1. 打开Web浏览器。
  2. 导航到https://
  3. 在右下角单击“下载受信任的根CA”链接

在Fedora

  1. 解压缩并将扩展名从.0更改为.cer
  2. 将其复制到/etc/pki/ca-trust/source/anchors/
  3. 执行update-ca-trust命令。

链接:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856

对于Centos 6/7, Fedora上的Python 3.4 +,只需按如下方式安装受信任CA:

  1. 将CA.crt拷贝到/etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract

Python 2.7.12(默认,2016年7月29日,15:26:22)修复了上述问题。这个信息可能会帮助到其他人。

import requests
requests.packages.urllib3.disable_warnings()


import ssl


try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
# Legacy Python that doesn't verify HTTPS certificates by default
pass
else:
# Handle target environment that doesn't support HTTPS verification
ssl._create_default_https_context = _create_unverified_https_context

从这里取https://gist.github.com/michaelrice/a6794a017e349fc65d01

你可以试着把这个添加到你的环境变量中:

PYTHONHTTPSVERIFY=0

注意,这将禁用所有 HTTPS验证,所以这是一个大锤式的方法,但如果不需要验证,这可能是一个有效的解决方案。

这不是您特定问题的解决方案,但我把它放在这里是因为这个线程是“SSL: certificate_verify_failed”的顶部谷歌结果,它导致我在徒劳的追逐。

如果你已经在OSX上安装了Python 3.6,并且正在获取&;SSL: CERTIFICATE_VERIFY_FAILED"当尝试连接到https://站点时,出现错误,这可能是因为OSX上的Python 3.6根本没有证书,并且不能验证任何SSL连接。这是OSX上3.6版本的更改,需要安装后步骤,即安装certifi证书包。这被记录在文件ReadMe.rtf中,你可以在/Applications/Python\ 3.6/ReadMe.rtf中找到(另见文件Conclusion.rtf,以及生成macOS安装程序的脚本build-installer.py)。

ReadMe会让你运行安装后的脚本

/Applications/Python\ 3.10/Install\ Certificates.command(终端应用程序,这个命令本身应该,解决问题。请确保使用当前的subversion更新文件路径。)

(它的来源是install_certificates.command),其中:

发行说明有更多信息:https://www.python.org/downloads/release/python-360/

在较新的Python版本中,有更多关于此的文档:

ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem

(FreeBSD 10.1)

试一试

PIP install——trusted.host pypi.python.org packagename

这对我很管用。

Craig Glennie的回答是:

MacOs Sierra上的Python 3.6.1

在bash终端中输入这个可以解决问题:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command

我需要补充另一个答案,因为就像Craig Glennie一样,由于网上有许多提到这个问题的帖子,我进行了一次徒劳的追逐。

我正在使用MacPorts,我最初认为的Python问题实际上是MacPorts问题:它在安装openssl时没有安装根证书。解决方案是port install curl-ca-bundle,如这篇博文所述。

看一看

/Applications/Python 3.6/Install Certificates.command

你也可以在Finder中找到Applications文件夹,然后单击Certificates.command

安装nltk的步骤(我已经在MAC OS X中安装了python3 (3.6.2)

sudo easy_install pip

使用ignore installed选项忽略卸载之前版本的6,否则,它会在卸载时给出一个错误,并且不进行电影转发

sudo pip3 install -U nltk --ignore-installed six

检查pip和python的安装,使用'3'版本

which python python2 python3
which pip pip2 pip3

检查NLTK是否安装

python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']

在安装示例之前安装SSL证书,否则我们将在安装示例时证书错误

/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book

这就成功地完成了nltk和nltk_ata的安装

我很惊讶所有这些指导都没有解决我的问题。尽管如此,诊断是正确的(顺便说一句,我使用Mac和Python3.6.1)。所以,总结一下正确的部分:

  • 在Mac上,苹果放弃了OpenSSL
  • Python现在使用它自己的CA根证书集
  • 二进制Python安装提供了一个脚本来安装Python所需的CA根证书("/Applications/Python 3.6/ install Certificates.command")
  • 详细信息请阅读“/Applications/Python 3.6/ReadMe.rtf”

对我来说,脚本不能工作,所有那些证书和openssl安装也未能修复。也许是因为我安装了多个python2和python3,以及许多virtualenv。最后,我需要手工修理它。

pip install certifi   # for your virtualenv
mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl
cp -a <your virtualenv>/site-package/certifi/cacert.pem \
/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

如果你还不满意的话。然后重新安装OpenSSL。

port install openssl

我遇到了类似的问题,尽管我在Python 3.4、3.5和3.6中使用了urllib.request.urlopen。(这是Python 3中等价于urllib2的一部分,根据Python 2的urllib2文档页开头的注释。)

我的解决方案是pip install certifi安装certifi,它有:

... 一个精心策划的根证书集合,用于验证SSL证书的可信度,同时验证TLS主机的身份。

然后,在我的代码中,我之前只有:

import urllib.request as urlrq


resp = urlrq.urlopen('https://example.com/bar/baz.html')

我将其修改为:

import urllib.request as urlrq
import certifi


resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

如果我正确地读取了urllib2.urlopen文档,它也有一个cafile参数。因此,urllib2.urlopen([...], certifi.where())可能也适用于Python 2.7。


更新(2020-01-01):从Python 3.6开始,改为__ABC1的cafile参数已弃用,而应该指定context参数。我发现以下功能在3.5到3.8版本中同样有效:

import urllib.request as urlrq
import certifi
import ssl


resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))

使用pip安装PyOpenSSL对我有用(没有转换为PEM):

pip install PyOpenSSL

我通过关闭Fiddler(一个HTTP调试代理)来解决这个问题,检查是否启用了代理并重试。

我对Mac OS X的解决方案:

  1. 使用从Python语言官方网站https://www.python.org/downloads/下载的本地应用程序Python安装程序升级到Python 3.6.5

我发现这个安装程序在更新新Python的链接和符号链接方面比自制的要好得多。

  1. 使用位于刷新后的Python 3.6目录中的"./Install Certificates.command"安装新证书
cd "/Applications/Python 3.6/"
sudo "./Install Certificates.command"

Amazon EC2上的Python 2.7,附带centOS 7

我必须设置env变量SSL_CERT_DIR指向我的ca-bundle,它位于/etc/ssl/certs/ca-bundle.crt

在python 2.7中,在文件C:\Python27\lib\site-packages\certifi\cacert中添加受信任根CA的详细信息。pem帮助

之后,我确实运行(使用管理员权限) pip install——trusted-host pypi.python.org——trusted-host pypi.org——trusted-host files.pythonhosted.org packageName

对于任何使用mechanize遇到这个问题的人,下面是如何将相同的技术应用到mechanize Browser实例:

br = mechanize.Browser()
context = ssl._create_unverified_context()
br.set_ca_data(context=context)

在Mac上安装证书解决了我的问题:

pip install certifi

我在在这里上找到了这个

我找到了这个解决方案,在你的源文件开始插入这段代码:

import ssl


try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
# Legacy Python that doesn't verify HTTPS certificates by default
pass
else:
# Handle target environment that doesn't support HTTPS verification
ssl._create_default_https_context = _create_unverified_https_context

这段代码将撤销验证,这样就不会验证ssl证书。

对于Linux Python3.6,这对我来说是可行的。

从命令行安装pyopenssl和certifi

sudo pip3 install -U pyopenssl
sudo pip3 install certifi

在我的python3脚本中,添加了verify='/usr/lib/python3.6/site-packages/certifi/cacert。Pem '是这样的:

import requests
from requests.auth import HTTPBasicAuth
import certifi


auth = HTTPBasicAuth('username', 'password')
body = {}


r = requests.post(url='https://your_url.com', data=body, auth=auth, verify='/usr/lib/python3.6/site-packages/certifi/cacert.pem')

水蟒的解决方案

我的设置是带有代理的MacOS上的Anaconda Python 3.7。路径不同。

  • 这是获取正确的证书路径的方法:
import ssl
ssl.get_default_verify_paths()

我的系统产生了什么

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

一旦你知道证书的位置,然后你连接代理使用的证书到该文件的末尾。

我已经设置了conda与我的代理工作,通过运行:

conda config --set ssl_verify <pathToYourFile>.crt

如果你不记得你的证书在哪里,你可以在~/.condarc中找到它:

ssl_verify: <pathToYourFile>.crt

现在连接该文件到/miniconda3/ssl/cert.pem的末尾 和请求应该工作,特别是sklearn.datasets和类似的工具 应该工作。< / p >

进一步的说明

其他解决方案没有工作,因为Anaconda设置略有不同:

  • 路径Applications/Python\ 3.X根本不存在。

  • 以下命令提供的路径为WRONG路径

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH

在我的情况下,我得到这个错误,因为requestsurllib3版本不兼容,在安装期间给出以下错误:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

成功了。

另一个水蟒解决方案。我在macOS上的Python 2.7环境中获得CERTIFICATE_VERIFY_FAILED。事实证明conda路径很糟糕:

基地(3.7)环境:

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 environment(路径不存在!)

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

解决办法:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem

这里已经有很多答案了,但我们在一个非常具体的案例中遇到了这个问题,花了很多时间调查,所以再加一个。我们在下面的例子中看到:

  • 在一个德比安式细长的码头集装箱里
  • 默认Python 3.5.3 easy_install3
  • 对于在Kubernetes集群中使用cert-manager注册的LetsEncrypt证书

pip3openssl命令行都能够验证证书,并且easy_install3能够成功验证其他LetsEncrypt证书。

解决办法是从源代码构建最新的Python(当时是3.7.3)。指令在这里是详细的,容易遵循。

我在我的一台Linux机器上遇到了类似的问题。生成新的证书并导出指向证书目录的环境变量,为我修复了它:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
$ cd $HOME
$ wget --quiet https://curl.haxx.se/ca/cacert.pem
$ export SSL_CERT_FILE=$HOME/cacert.pem

来源:https://access.redhat.com/articles/2039753

SSL: CERTIFICATE_VERIFY_FAILED错误也可能发生,因为在Linux上的ca-certificates包中缺少中间证书。例如,在我的例子中,中间证书“DigiCert SHA2安全服务器CA”在ca-certificates包中缺失,尽管Firefox浏览器包含了它。您可以通过直接在导致此错误的URL上运行wget命令来查找缺少哪个证书。然后,您可以从证书颁发机构的官方网站(例如,在我的情况下为https://www.digicert.com/digicert-root-certificates.htm)搜索到此证书的CRT文件的相应链接。现在,要包含在您的案例中丢失的证书,您可以使用CRT文件下载链接运行以下命令:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt


mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der


openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt


sudo mkdir /usr/share/ca-certificates/extra


sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/


sudo dpkg-reconfigure ca-certificates

在此之后,您可以再次使用wget测试URL,也可以使用python urllib包进行测试。更多细节,请参考:https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

有些情况下,你不能使用不安全的连接或将ssl上下文传递到urllib请求。这里我的解决方案基于 https://stackoverflow.com/a/28052583/6709778 < / p >

在这种情况下,如果您想使用自己的证书文件

import ssl


def new_ssl_context_decorator(*args, **kwargs):
kwargs['cafile'] = '/etc/ssl/certs/ca-certificates.crt'
return ssl.create_default_context(*args, **kwargs)


ssl._create_default_https_context = ssl._create_unverified_context

或者您可以使用certifi中的共享文件

def new_ssl_context_decorator(*args, **kwargs):
import certifi
kwargs['cafile'] = certifi.where()
return ssl.create_default_context(*args, **kwargs)

如果你有私人证书要处理,比如你的组织自己的CA根和链的中间部分,那么最好将证书添加到CA文件中,即cacert。pem,而不是绕过整个安全设备(verify=False)。下面的代码让你在2.7+和3+

考虑添加整个证书链,当然您只需要这样做一次。

import certifi


cafile=certifi.where() # cacert file
with open ('rootca.pem','rb') as infile:
customca=infile.read()
with open(cafile,'ab') as outfile:
outfile.write(customca)
with open ('interca.pem','rb') as infile:
customca=infile.read()
with open(cafile,'ab') as outfile:
outfile.write(customca)
with open ('issueca.pem','rb') as infile:
customca=infile.read()
with open(cafile,'ab') as outfile:
outfile.write(customca)

那这个应该能让你振作起来

import requests
response = requests.request("GET", 'https://yoursecuresite.com',  data = {})
print(response.text.encode('utf8'))

希望这能有所帮助

我在Python 2.7.9中遇到了这个问题

以下是我所做的:

  • 卸载Python 2.7.9
  • 删除c:\Python27文件夹
  • 下载了Python 2.7.18,这是今天最新发布的Python 2.7。
  • 重新运行应用程序
  • 它成功了!

没有任何[CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)"错误了。

导入请求
Response = requests.get("你想要点击的url/api ", verify="到SSL证书的路径")

对我来说,问题是上面的答案没有一个完全帮助我,但给了我正确的方向。

当然,SSL证书是需要的,但当你在公司的防火墙后面,那么公开的证书可能没有帮助p。您可能需要联系您公司的IT部门来获得证书,因为每个公司都使用从他们签约服务的安全提供商那里获得的特殊证书。并将其放在一个文件夹中,并将该文件夹的路径作为参数传递给验证参数

对我来说,即使在尝试了上述所有解决方案并使用了错误的证书后,我也无法使其工作。因此,请记住那些在公司防火墙后的人要获得正确的证书。它可以决定请求调用的成功和失败。

在我的例子中,我把证书放在下面的路径中,它像魔术一样起作用。

C:\Program Files\Common文件\ssl

你也可以参考https://2.python-requests.org/en/master/user/advanced/#id3,它讨论ssl验证

我得到了同样的错误,在我放弃并开始自己尝试之前,我也进行了相当长一段时间的徒劳追逐。我终于明白了,所以我想分享一下。在我的例子中,我在Linux上运行Python 2.7.10(由于我无法控制的原因),不能访问requests模块,不能在OS或Python级别全局安装证书,不能设置任何环境变量,并且需要访问使用内部颁发证书的特定内部站点。

注意:禁用SSL验证从来不是一个选项。我正在下载一个脚本,它可以立即以根用户的身份运行。没有SSL验证,任何web服务器都可以假装是我的目标主机,而我只是接受他们给我的任何东西,并以root身份运行它!

我将根而且中间证书(可能不止一个)以pem格式保存到一个文件中,然后使用以下代码:

import ssl,urllib2
data = urllib2.build_opener(urllib2.HTTPSHandler(context=ssl.create_default_context(cafile='/path/to/ca-cert-chain.pem')), urllib2.ProxyHandler({})).open('https://your-site.com/somefile').read()
print(data)

注意,我在这里添加了urllib2.ProxyHandler({})。这是因为在我们的环境中,代理是默认设置的,但它们只能访问外部站点,不能访问内部站点。如果没有代理绕过,我就无法访问内部站点。如果你没有这个问题,你可以简化如下:

data = urllib2.build_opener(urllib2.HTTPSHandler(context=ssl.create_default_context(cafile='/path/to/ca-cert-chain.pem'))).open('https://your-site.com/somefile').read()

工作起来很有魅力,而且不会危及安全。

享受吧!

如果证书是通过“让我们加密”颁发的,请确保在客户端上的中间证书存储中删除过期的DST根CA X3颁发的R3证书。

我的解决方案是使用美丽的汤一个python包。它神奇地处理SSL的事情。Beautiful Soup是一个可以很容易地从网页中抓取信息的库。

from bs4 import BeautifulSoup as soup
import requests
url = "https://dex.raydium.io/#/market/2xiv8A5xrJ7RnGdxXB42uFEkYHJjszEhaJyKKt4WaLep"
html = requests.get(url, verify=True)
 

page_soup = soup(html.text, 'html.parser')
print(page_soup.prettify())

我认为你有几种方法可以解决这个问题。我提到了以下5种方法:

  1. 你可以为每个请求定义上下文,并在每个请求上传递上下文,如下所示:
import certifi
import ssl
import urllib
context = ssl.create_default_context(cafile=certifi.where())
result = urllib.request.urlopen('https://www.example.com', context=context)
  1. 或在environment中设置证书文件。
import os
import certifi
import urllib
os.environ["REQUESTS_CA_BUNDLE"] = certifi.where()
os.environ["SSL_CERT_FILE"] = certifi.where()
result = urllib.request.urlopen('https://www.example.com')


  1. 替换create default https context方法:
import certifi
import ssl
ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where())
result = urllib.request.urlopen('https://www.example.com')
  1. 如果您使用Linux机器,生成新的证书并导出指向证书目录的环境变量,则可以修复此问题。
$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
  1. 如果你使用Mac机器,生成新的证书
$ cd "/Applications/$(python3 --version | awk '{print $2}'| awk  -F. '{print "Python " $1"."$2}')"
$ sudo "./Install Certificates.command"

您可以使用以下命令在python中安装包

在木星笔记本上

!pip install --trusted-host=pypi.org --trusted-host=files.pythonhosted.org --user [Pacakage name]


!pip install --trusted-host=pypi.org --trusted-host=files.pythonhosted.org --user xgboost

请注意,我已经尝试在mac和windows中安装证书