使用SSL证书和代理

时间:2017-09-01 00:13:56

标签: python ssl python-requests ssl-certificate

我通过代理访问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"作为网址。我收到这个错误:

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'。但我不明白为什么会发生其他错误。证书文件位于我的文件夹层次结构中的正确位置,并从代理服务下载,所以我知道它是对的。

简单的选择是不使用证书并禁止安全警告,但我想正确地做到这一点。任何人都可以解释发生了什么以及如何解决它?

1 个答案:

答案 0 :(得分:1)

我认为您误解了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以及如何在使用客户端证书进行身份验证时使用它,并在服务器证书验证中使用how to use verify