Python 将 SSL 证书与代理一起使用时出错
Python error using SSL certificate with proxy
我正在通过代理访问 https 页面:
def read_page(self,url):
'''
Gets web page using proxy and returns beautifulsoup object
'''
soup = None
try:
r = requests.get(url, proxies=PROXIES, auth=PROXY_AUTH,
cert = ('../static/crawlera-ca.crt'), verify=False,allow_redirects=False)
except requests.exceptions.MissingSchema:
return False
if r.status_code == 200:
soup = bs4.BeautifulSoup(r.text, "html.parser")
if soup:
return soup
return False
我将“https://www.bestbuy.com”作为 url。我收到此错误:
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.bestbuy.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(336265225, '[SSL] PEM lib (_ssl.c:2964)'),))
当我删除 cert = ('../static/crawlera-ca.crt')
参数时,程序会成功访问该站点并给我一个 'InsecureRequestWarning',这是预期的。但我不明白为什么会发生另一个错误。证书文件在我的文件夹层次结构中的正确位置,并且是从代理服务下载的,所以我知道它是正确的。
简单的选择是不使用证书并禁止显示安全警告,但我想正确地做到这一点。任何人都可以解释发生了什么以及我该如何解决它吗?
我认为您误解了 cert
参数的含义。这不是您似乎认为的受信任 CA(的列表),但此参数用于您用来对服务器进行身份验证的客户端证书。并且,这种用于认证的证书还需要匹配的私钥。
鉴于它在没有此参数的情况下工作,服务器显然不需要您的客户端证书(无论如何这并不常见)。您可能打算改为使用 ../static/crawlera-ca.crt
作为证书验证的可信 CA 列表。在这种情况下,您不应使用 cert
参数,而应使用 verify
参数,如下所示:
r = requests.get(url, proxies=PROXIES, auth=PROXY_AUTH,
verify = '../static/crawlera-ca.crt',
allow_redirects=False)
有关详细信息,请参阅服务器证书验证中的 documentation of cert parameter and how to use it in authentication with client certificates and how to use verify。
我正在通过代理访问 https 页面:
def read_page(self,url):
'''
Gets web page using proxy and returns beautifulsoup object
'''
soup = None
try:
r = requests.get(url, proxies=PROXIES, auth=PROXY_AUTH,
cert = ('../static/crawlera-ca.crt'), verify=False,allow_redirects=False)
except requests.exceptions.MissingSchema:
return False
if r.status_code == 200:
soup = bs4.BeautifulSoup(r.text, "html.parser")
if soup:
return soup
return False
我将“https://www.bestbuy.com”作为 url。我收到此错误:
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.bestbuy.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(336265225, '[SSL] PEM lib (_ssl.c:2964)'),))
当我删除 cert = ('../static/crawlera-ca.crt')
参数时,程序会成功访问该站点并给我一个 'InsecureRequestWarning',这是预期的。但我不明白为什么会发生另一个错误。证书文件在我的文件夹层次结构中的正确位置,并且是从代理服务下载的,所以我知道它是正确的。
简单的选择是不使用证书并禁止显示安全警告,但我想正确地做到这一点。任何人都可以解释发生了什么以及我该如何解决它吗?
我认为您误解了 cert
参数的含义。这不是您似乎认为的受信任 CA(的列表),但此参数用于您用来对服务器进行身份验证的客户端证书。并且,这种用于认证的证书还需要匹配的私钥。
鉴于它在没有此参数的情况下工作,服务器显然不需要您的客户端证书(无论如何这并不常见)。您可能打算改为使用 ../static/crawlera-ca.crt
作为证书验证的可信 CA 列表。在这种情况下,您不应使用 cert
参数,而应使用 verify
参数,如下所示:
r = requests.get(url, proxies=PROXIES, auth=PROXY_AUTH,
verify = '../static/crawlera-ca.crt',
allow_redirects=False)
有关详细信息,请参阅服务器证书验证中的 documentation of cert parameter and how to use it in authentication with client certificates and how to use verify。