pycurl 和 SSL 证书

Posted

技术标签:

【中文标题】pycurl 和 SSL 证书【英文标题】:pycurl and SSL cert 【发布时间】:2012-01-10 02:01:27 【问题描述】:

我正在尝试编写一个 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 routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed')

代码失败,因为它未能获得 SSL 证书。

如果我将以下几行添加到我的代码中,错误就会消失。

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

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

我知道我的本地证书存储中有 SSL 证书。有谁知道如何导出我的证书并在我的代码中使用它.. 一些示例代码会很棒..

感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

你是对的,你这样做的方式会使你受到中间人攻击,尤其是考虑到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()

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

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

【讨论】:

【参考方案2】:

您是否阅读过 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 选项,所以这应该很容易在您的代码中实现。

【讨论】:

感谢您的回复.. 我阅读了这篇文章.. 然后我尝试使用 curl.exe 和以下选项获取证书.. curl.exe --cacert test.crt secure-site ..我收到以下错误..“curl:(1)libcurl中不支持或禁用协议https”..任何想法如何解决它? 我下载了 curl 源代码并自行构建.. 刚得到一个网址,我可以在其中下载现成的 Curl.exe "curl.haxx.se/latest.cgi?curl=win32-ssl-devel-msvc".. 我会探索一下!【参考方案3】:

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

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

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

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

【讨论】:

以上是关于pycurl 和 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

python关于SSL的认证--pycurl模块使用

pycurl报错: ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-tim

install pycurl

转python版本的curl工具pycurl学习

OS X 下安装 pycurl

Python 中哪个最好:urllib2、PycURL 或 mechanize?