【问题标题】:R: download data securely using TLS/SSLR:使用 TLS/SSL 安全下载数据
【发布时间】: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

问题

  1. 如何在 RCurl 中正确使用 HTTPS?
  2. 对于单纯的文件下载(无标题、cookie 等),使用 RCurl 代替 download.file() 有什么好处吗?
  3. 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


【解决方案1】:

与RCurl捆绑的openssl目前有点旧,不支持TLS v1.2

是的,curl 包没问题

或者您可以使用httr 包,它是curl 包的包装器

> library("httr")
> GET("https://curl.haxx.se/ca/cacert.pem",config(sslversion=6,ssl_verifypeer=1))
Response [https://curl.haxx.se/ca/cacert.pem]
  Date: 2017-08-16 17:07
  Status: 200
  Content-Type: application/x-pem-file
  Size: 256 kB
<BINARY BODY>

【讨论】:

  • 作为一个包,RCurl 相对 recent (2016-03-01)。如果捆绑的 openssl 比这更旧,这就像说 RCurl 是无人维护的,不应该在 CRAN 上。
猜你喜欢
  • 2018-05-26
  • 2017-05-27
  • 2018-04-06
  • 2012-11-04
  • 1970-01-01
  • 2010-10-22
  • 2021-12-13
相关资源
最近更新 更多