在Python中失败的URL请求 - 找不到SSL证书

时间:2017-07-08 01:55:30

标签: python python-3.x ssl

我有一个简单的屏幕抓取程序,通过BeautifulSoup获取HTML页面,使用代理抓取服务(Scrapinghub):

def make_soup(self,current_url):
    soup = None
    r = requests.get(current_url, proxies=self.proxies, auth=self.proxy_auth,
         verify='static/crawlera-ca.crt')
    if r.status_code == 200:
        soup = bs4.BeautifulSoup(r.text, "html.parser")
        if soup:
            return soup
    return False

当我在http://网站上运行它时,它可以正常工作。

当我在https://网站上运行它时会返回:

Traceback (most recent call last):
  File "/home/danny/Documents/virtualenvs/AskArbyEnv/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 295, in ssl_wrap_socket
    context.load_verify_locations(ca_certs, ca_cert_dir)
FileNotFoundError: [Errno 2] No such file or directory

甚至更奇怪的是,当我在访问相同https://站点的单元测试中运行它时,它可以工作。

单元测试和正在运行的代码之间唯一变化的是我附加到传递给'make_soup'的URL的搜索项。每个生成的URL格式正确,我可以在浏览器中访问它们。

这让我觉得它与丢失的SSL证书无关。那么为什么它似乎抱怨它无法找到证书文件呢?

1 个答案:

答案 0 :(得分:3)

通过在对verify='static/crawlera-ca.crt'的通话中指定requests.get,您说您访问的所有网站都必须拥有crawlera-ca.crt签名的证书。如果您的代理不是重新写入请求/响应和服务器证书(它不应该,但检查下面的更新),那么您对https站点的所有请求都将失败。< / p>

此外,如果您仔细阅读错误消息,您可能会发现磁盘上甚至没有crawlera-ca.crt个文件。

要解决您的问题,只需删除verify参数即可。这样requests will use the defaultcertifi捆绑(requests>=2.4.0)。对于非侵入性代理,这是正确的解决方案。或者,如果您确实需要,可以将您信任的一些CA证书添加到本地certifi商店,但要非常小心您要添加哪些证书。

<强>更新即可。看起来像Crawlera代理是一个中间人毕竟! Bad Crawlera,坏,坏,坏!

$ curl -vvv -x proxy.crawlera.com:8010 --cacert crawlera-ca.crt https://google.com/
[...snip...]
* Proxy replied OK to CONNECT request
* found 1 certificates in crawlera-ca.crt
* found 697 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_256_GCM_SHA384
*    server certificate verification OK
*    server certificate status verification SKIPPED
*    common name: google.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #1
*    subject: CN=google.com
*    start date: Sat, 08 Jul 2017 13:33:53 GMT
*    expire date: Tue, 06 Jul 2027 13:33:53 GMT
*    issuer: C=IE,ST=Munster,L=Cork,O=ScrapingHub,OU=Leading Technology and Professional Services,CN=Crawlera CA,EMAIL=support@scrapinghub.com
*    compression: NULL

请注意CN=google.com发布的O=ScrapingHub,CN=Crawlera CA

这意味着Crawlera / ScrapingHub会重新加密您对目标网址的每个请求,并读取您与该网站交换的所有私人和敏感数据!据我所知,这是他们缓存原始请求并在刮擦同一站点的所有用户之间节省一些带宽的唯一方法,也是检查内容合法性的唯一方法,但仍然如此。他们应该放在FAQ的某个地方,我不确定他们会这样做。