【问题标题】:RCurl and self-signed certificate issuesRCurl 和自签名证书问题
【发布时间】:2023-05-20 03:52:02
【问题描述】:

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

我已阅读有关该主题的FAQcurl page。所以这就是我的立场:

  1. 我已将证书副本保存到磁盘 (~/cert.pem)。
  2. 我已经能够使用这个相同的文件通过 python-requests 和“验证”选项连接到服务器,并且成功了。
  3. 命令行上的 curl 似乎忽略了 --cacert 选项。在我使用 Mac OS X 的“钥匙串访问”应用程序将证书标记为受信任后,我成功地使用它访问了该网站。
  4. RCurl顽固地拒绝连接网站,代码如下:

    getURL("https://somesite.tld", verbose=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

当我在具有相同 cert.pem 文件和完全相同的 URL 的 Linux VM 中使用 --cacert 选项和上面的 RCurl 代码测试 curl 时,它运行良好。

因此,Linux 和 Mac OS X 上的测试相同,只有在 Mac OS X 上它们才会失败。即使将证书添加到钥匙串也不起作用。

唯一有效的是使用ssl.verifypeer=FALSE,但出于安全原因我不想这样做。

我在这里没有想法。其他人对如何使其工作有任何建议吗?

【问题讨论】:

  • 加了票看看作者有没有反馈给我:github.com/omegahat/RCurl/issues/6
  • 我得出的结论是 RCurl 毫无希望。例如,阅读源代码时,我意识到当它们被垃圾收集时,并没有做任何努力来关闭带有底层 C 库 curl 的句柄,这会留下打开的连接并导致资源耗尽,如果你使用它超过一些琐碎的下载(github.com/omegahat/RCurl/issues/8)。
  • 我已经编写了一些使用requestsgrequests 的Python 代码。然后我写了一个小的 R 包装器来从外部调用该代码。这带来了巨大的性能提升,我能够正确使用证书并且没有资源耗尽问题。

标签: r macos curl ssl rcurl


【解决方案1】:

你可以试试:

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

【讨论】:

  • 我没有测试过这个,因为我不再使用 RCurl,但是cainfo curl 选项肯定是要走的路。不错的收获。
【解决方案2】:

回到这个问题,我只想指出,如果你还在使用 RCurl,你应该改用httr(它使用curl)。

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

【讨论】:

  • 请注意,config() 是包 httr 的一部分,因此即使您不加载包 httrhttr::config(cainfo="/path/to/certificate") 也可以工作。