【发布时间】:2023-05-20 03:52:02
【问题描述】:
我在获取 RCurl 函数 getURL 以访问使用自签名证书的服务器上的 HTTPS URL 时遇到问题。我在 Mac OS X 10.9.2 上运行 R 3.0.2。
我已阅读有关该主题的FAQ 和curl page。所以这就是我的立场:
- 我已将证书副本保存到磁盘 (~/cert.pem)。
- 我已经能够使用这个相同的文件通过 python-requests 和“验证”选项连接到服务器,并且成功了。
- 命令行上的 curl 似乎忽略了 --cacert 选项。在我使用 Mac OS X 的“钥匙串访问”应用程序将证书标记为受信任后,我成功地使用它访问了该网站。
-
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)。