pycurl和SSL证书

时间:2011-11-30 20:40:02

标签: python ssl pycurl

我正在尝试编写pycurl脚本来访问安全站点(HTTPS)。

c = pycurl.Curl()
c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0')
c.setopt(pycurl.URL, 'https://for-example-securedsite')
c.setopt(pycurl.COOKIEFILE, 'cookie.txt')
c.setopt(pycurl.COOKIEJAR, 'cookies.txt')
c.setopt(pycurl.WRITEDATA, file("page.html","wb"))   

我收到以下错误..

pycurl.error:(60,'SSL证书问题,验证CA证书是否正常。详细信息:\ nerror:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败')

代码失败,因为它无法获得SSL证书。

如果我在代码中添加以下行,则错误消失。

c.setopt(pycurl.SSL_VERIFYPEER, 0)   
c.setopt(pycurl.SSL_VERIFYHOST, 0)

上述代码将跳过证书验证。但它遭受了“中间人”攻击。

我知道我的本地证书库中有SSL证书。有谁知道如何导出我的证书并使用它我的代码..一些示例代码将是真棒..

谢谢你的时间!

3 个答案:

答案 0 :(得分:23)

你是对的,你这样做的方式让你受到中间人攻击,特别是在most recent SSL vulnerabilities的情况下。您可以按如下方式解决此问题:

import pycurl
curl = pycurl.Curl()
curl.setopt(pycurl.URL, "https://your-secure-website.com/")
curl.setopt(pycurl.SSL_VERIFYPEER, 1)
curl.setopt(pycurl.SSL_VERIFYHOST, 2)
curl.setopt(pycurl.CAINFO, "/path/to/updated-certificate-chain.crt")
curl.perform()

默认情况下卷曲带有过时的证书列表。无论您是要更新它还是仅使用自己的证书进行测试,请确保将updated-certificate-chain.crt文件放在可访问的位置,并使用pycurl.CAINFO选项指向它。

还要确保pycurl.SSL_VERIFYHOST设置为2,这是最高安全性检查设置。

答案 1 :(得分:1)

您是否阅读过cURL文档about SSL certificates?这似乎直接解决了您的问题......特别是第2项:

 2. Get a CA certificate that can verify the remote server and use the proper
    option to point out this CA cert for verification when connecting. For
    libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);

看起来pycurl模块包含CAPATH选项,因此在您的代码中应该很容易实现。

答案 2 :(得分:0)

此问题的解决方案在于通过不安全的参数 In a cmd terminal we exclusively input the arg '-k' 为 curl 对象提供对基于“https”的协议 URL 的访问权限

在 Pycurl 中,我们必须通过以下方法为 curl 对象设置相同的选项,安全级别最低,即“0”。

c.setopt(pycurl.SSL_VERIFYPEER, 0)   
c.setopt(pycurl.SSL_VERIFYHOST, 0)

allow the insecure connection 之后,就可以毫无障碍地访问 SSL