gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:17 24 4
gpt4 key购买 nike

官方声明

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

All builds have support for https: URLs in the default methods for download.file(), url() and code making use of them. Unfortunately that cannot guarantee that any particular https: URL can be accessed. ... Different access methods may allow different protocols or use private certificate bundles ...

download.file() 帮助仍然说:

Contributed package 'RCurl' provides more comprehensive facilities to download from URLs.

which(顺便说一句,包括 cookies 和 headers 管理)。

基于 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. 对于单纯的文件下载(没有 header 、cookie 等),使用 RCurl 代替 download.file() 有什么好处吗?
  3. RCurl 是否已过时,我们是否应该选择 curl

更新

问题一直持续到Windows 10 下的 R 版本 3.4.1 (2017-06-30)。

最佳答案

与 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>

关于R:使用 TLS/SSL 安全下载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43548960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com