pycurl和SSL证书
我正在尝试写一个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 个回答
你有没有看过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
选项,所以在你的代码中实现这个应该很简单。
我在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的用户。
你说得对,按照你现在的做法,可能会遭遇中间人攻击,尤其是考虑到最近发现的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,这是最高的安全检查级别。