Pycurl和SSL证书

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证书。 有人知道如何导出我的证书并在我的代码中使用它吗?一些示例代码会很棒..

感谢您的时间!

4个回答

25

你说得对,你现在的做法让你容易受到中间人攻击,特别是考虑到最近出现的SSL漏洞。你可以通过以下方式解决:

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

当我在Windows中使用Python 3时,遇到以下错误:

(60, 'SSL证书问题:无法获取本地颁发者证书')

最终的两个解决方案:

1- 添加证书,curl.setopt(pycurl.CAINFO, "c:\certs\ssl.cert")

或者

2- 忽略SSL验证 :
curl.setopt(pycurl.SSL_VERIFYPEER, 0)
curl.setopt(pycurl.SSL_VERIFYHOST, 0)

@适用于所有Windows中的Python用户。


1
你有阅读过关于SSL证书的cURL文档?它似乎直接回答了你的问题...特别是第二项:
 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 https://secure-site/。但是我遇到了以下错误:"curl: (1) Protocol https not supported or disabled in libcurl"。您有什么想法如何解决它吗? - K2M
我下载了curl源代码并自己构建了它。刚刚得到了一个可以下载现成的Curl.exe的网址"http://curl.haxx.se/latest.cgi?curl=win32-ssl-devel-msvc"。我会去探索一下! - K2M

0

这个问题的解决方案在于通过不安全参数(在cmd终端中输入'-k'),使curl对象可以访问基于'https'协议的url。

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

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

允许不安全连接

之后,可以无障碍地访问SSL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接