2014-02-26 82 views
7

我遇到问题RCurl函数getURL访问使用自签名证书的服务器上的HTTPS URL。我在Mac OS X 10.9.2上运行R 3.0.2。RCurl和自签名证书问题

我已阅读关于此主题的FAQcurl page。所以这是我站在:

  1. 我已经将证书的副本保存到磁盘(〜/ cert.pem)。
  2. 我已经能够使用这个非常相同的文件连接到服务器使用python的请求和'验证'选项,并成功。
  3. curl在命令行上似乎忽略了--cacert选项。在我使用Mac OS X'Keychain Access'应用程序将证书标记为可信后,我成功地访问了该网站。
  4. 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,但我不想这样做是出于安全原因。

我在这里没有想法。其他人有什么建议如何让这个工作?

+0

添加了一张票,看看作者是否给了我一些反馈:https://github.com/omegahat/RCurl/issues/6 – asieira

+0

我得出的结论是RCurl是无望的。例如,阅读源代码,我意识到,在收集垃圾时,没有任何努力来关闭具有基于C的lib卷曲的句柄,这会导致开放的连接并导致资源耗尽,如果您将它用于多于一个几个简单的下载(https://github.com/omegahat/RCurl/issues/8)。 – asieira

+0

我改写了一些使用[requests](http://docs.python-requests.org/en/latest/)和[grequests](https://github.com/kennethreitz/grequests)的Python代码。然后我写了一个小R包装来外部调用这些代码。这产生了巨大的性能提升,我能够正确使用证书,并且没有资源耗尽问题。 – asieira

回答

0

说回这个问题,我只是想指出,如果你还在使用RCurl,你应该使用httr(使用curl)来代替。

我确认使用带有httr连接的config(cainfo="/path/to/certificate")将按预期工作。

1

你可以试试:

library ("RCurl") 
URL1 <- "https://data.mexbt.com/ticker/btcusd" 
getURL(URL1,cainfo=system.file("CurlSSL","cacert.pem",package="RCurl")) 
+0

我没有测试过,因为我不再使用RCurl,但'cainfo' curl选项肯定是要走的路。很好的接收。 – asieira