过去,基础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
download.file()
有什么好处吗?问题依然存在 Windows 10下的R版本3.4.1(2017-06-30)。
答案 0 :(得分:1)
与RCurl捆绑在一起的openssl目前有点老了,它不支持TLS v1.2
是的,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>