R:使用TLS / SSL安全下载数据

时间:2017-04-21 17:42:11

标签: r ssl curl ssl-certificate rcurl

官方声明

过去,基础R download.file()无法使用HTTPS协议,因此必须使用RCurl。自R 3.3.0以来:

  

所有版本都支持https:URL,默认方法是download.file(),url()和使用它们的代码。遗憾的是,无法保证可以访问任何特定的https:URL。 ...不同的访问方法可能允许不同的协议或使用私有证书包......

download.file()帮助仍然说:

  

贡献的包' RCurl'提供更全面的网址下载工具。

(顺便提一下包括cookie和标题管理)。

基于RCurl FAQ(查找"当我尝试通过https与网址互动时,我收到错误"),可以通过以下方式管理HTTPS网址:

getURL(url, cainfo="CA bundle")

其中CA bundle是证书颁发机构捆绑文件的路径。一个这样的捆绑可以从卷曲网站本身获得:
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吗?
  4. 更新

    问题依然存在 Windows 10下的R版本3.4.1(2017-06-30)。

1 个答案:

答案 0 :(得分: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>