【发布时间】:2017-09-18 19:48:24
【问题描述】:
官方声明
过去,基础 R download.file() 无法使用 HTTPS 协议,因此必须使用 RCurl。自R 3.3.0:
所有构建都支持 https:默认方法中的 URL,用于 download.file()、url() 和使用它们的代码。不幸的是,这不能保证可以访问任何特定的 https: URL。 ...不同的访问方法可能允许不同的协议或使用私有证书包 ...
download.file() 帮助仍然说:
提供的包“RCurl”提供了更全面的从 URL 下载的工具。
其中(顺便说一下,包括 cookie 和标头管理)。
基于RCurl FAQ(查找“当我尝试通过 https 与 URL 交互时,我收到错误”),可以使用以下方式管理 HTTPS URL:
getURL(url, cainfo="CA bundle")
其中CA bundle 是证书颁发机构捆绑文件的路径。 curl 站点本身提供了一个这样的包:
https://curl.haxx.se/ca/cacert.pem
当前状态
测试基于 Windows 平台
对于许多 HTTPS 网站,download.file() 按说明工作:
download.file(url="https://www.google.com", destfile="google.html")
download.file(url="https://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")
关于 RCurl,使用上面下载的 cacert.pem 包,可能会出错:
library(RCurl)
getURL("https://www.google.com", cainfo = "cacert.pem")
# Error in function (type, msg, asError = TRUE) :
# SSL certificate problem: unable to get local issuer certificate
在这种情况下,只需删除对证书包的引用即可解决问题:
getURL("https://www.google.com") # works
getURL("https://www.google.com", ssl.verifypeer=TRUE) # works
ssl.verifypeer = TRUE 用于确保成功不是由于getURL() 抑制安全性。该论点记录在RCurl FAQ 中。
但是,在其他情况下,连接会失败:
getURL("https://curl.haxx.se/ca/cacert.pem")
# Error in function (type, msg, asError = TRUE) :
# error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
同样,使用之前下载的包:
getURL("https://curl.haxx.se/ca/cacert.pem", cainfo = "cacert.pem")
# Error in function (type, msg, asError = TRUE) :
# error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
即使在抑制安全性时也会发生同样的错误:
getURL("https://curl.haxx.se/ca/cacert.pem", ssl.verifypeer=FALSE)
# same error as above
问题
- 如何在 RCurl 中正确使用 HTTPS?
- 对于单纯的文件下载(无标题、cookie 等),使用 RCurl 代替
download.file()有什么好处吗? - RCurl 是否已过时,我们是否应该选择curl?
更新
问题仍然存在 Windows 10 下的 R 版本 3.4.1 (2017-06-30)。
【问题讨论】:
-
Winston Chang(R Graphics Cookbook 的作者)有一个名为 downloader 的存储库,用于使用 HTTPS 下载文件,该文件没有外部依赖项,被宣传为 RCurl 的替代方案。
-
@ctesta01:实际上在
downloader中找不到任何 RCurl 功能。实际上,后者只是“download.file函数的包装”。另请注意,该软件包相当陈旧:过去,包装器可能有助于抽象平台特定的下载问题,但目前download.file针对平台进行了优化,因此使用下载器没有实际意义。 -
@antonio 这些是零星的失败,还是对你来说一直失败?我已经在 R 3.3.3 (MacOS) 和 R 3.3.2 (Linux) 上多次尝试了上述每个场景,都使用 RCurl 1.95-4.8,但我还没有看到失败。
-
@anthonyserious:感谢您的反馈。请参阅更新部分。
标签: r ssl curl ssl-certificate rcurl