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 例程:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed')

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

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

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

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

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

谢谢你的时间!

4

3 回答 3

24

你是对的,你这样做的方式会使你受到中间人攻击,尤其是考虑到最近的 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,即最高安全检查设置。

于 2012-10-25T16:05:03.780 回答
1

您是否阅读过有关 SSL 证书的 cURL 文档?这似乎直接解决了您的问题……特别是第 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选项,因此这应该很容易在您的代码中实现。

于 2011-11-30T20:43:35.980 回答
0

这个问题的解决方案在于通过不安全的参数提供 curl 对象访问基于“https”的协议 url在 cmd 终端中,我们专门输入 arg '-k'

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

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

允许不安全的连接 之后,可以无障碍地访问 SSL

于 2021-05-26T01:24:22.033 回答