pycurl和SSL证书

27 投票
4 回答
49152 浏览
提问于 2025-04-17 07:25

我正在尝试写一个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证书是否正常。详细信息:\n错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败')

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

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

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

上面的代码会跳过证书验证。但这样会面临“中间人攻击”的风险。

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

谢谢你的时间!

4 个回答

1

你有没有看过cURL的文档,里面有关于SSL证书的内容?这似乎直接回答了你的问题……特别是第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

我在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的用户。

26

你说得对,按照你现在的做法,可能会遭遇中间人攻击,尤其是考虑到最近发现的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,这是最高的安全检查级别。

撰写回答