我遇到问题RCurl函数getURL
访问使用自签名证书的服务器上的HTTPS URL。我在Mac OS X 10.9.2上运行R 3.0.2。RCurl和自签名证书问题
我已阅读关于此主题的FAQ和curl page。所以这是我站在:
- 我已经将证书的副本保存到磁盘(〜/ cert.pem)。
- 我已经能够使用这个非常相同的文件连接到服务器使用python的请求和'验证'选项,并成功。
- curl在命令行上似乎忽略了--cacert选项。在我使用Mac OS X'Keychain Access'应用程序将证书标记为可信后,我成功地访问了该网站。
RCurl顽固地拒绝用下面的代码连接到网站:
使用getURL( “https://somesite.tld”,冗长= T,cainfo = normalizePath( “〜/ cert.pem”))
这是输出我得到:
* Adding handle: conn: 0x7f92771b0400
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 38 (0x7f92771b0400) send_pipe: 1, recv_pipe: 0
* About to connect() to somesite.tld port 443 (#38)
* Trying 42.42.42.42...
* Connected to somesite.tld (42.42.42.42) port 443 (#38)
* SSL certificate problem: Invalid certificate chain
* Closing connection 38
当我上面在Linux VM测试既与--cacert
选项和RCurl代码卷曲具有相同cert.pem文件并网址完全相同,它工作完美。
因此,在Linux和Mac OS X上进行相同的测试,仅在Mac OS X上测试失败。即使将证书添加到钥匙串也不起作用。
唯一能做的工作是使用ssl.verifypeer=FALSE
,但我不想这样做是出于安全原因。
我在这里没有想法。其他人有什么建议如何让这个工作?
添加了一张票,看看作者是否给了我一些反馈:https://github.com/omegahat/RCurl/issues/6 – asieira
我得出的结论是RCurl是无望的。例如,阅读源代码,我意识到,在收集垃圾时,没有任何努力来关闭具有基于C的lib卷曲的句柄,这会导致开放的连接并导致资源耗尽,如果您将它用于多于一个几个简单的下载(https://github.com/omegahat/RCurl/issues/8)。 – asieira
我改写了一些使用[requests](http://docs.python-requests.org/en/latest/)和[grequests](https://github.com/kennethreitz/grequests)的Python代码。然后我写了一个小R包装来外部调用这些代码。这产生了巨大的性能提升,我能够正确使用证书,并且没有资源耗尽问题。 – asieira