Подтвердить что ты не робот

R: безопасная загрузка данных с использованием TLS/SSL

Официальные заявления

В прошлом база R download.file() не смогла работать с протоколами HTTPS, и было необходимо использовать RCURL. Поскольку R 3.3.0:

Все сборки поддерживают https: URL-адреса в методах по умолчанию для download.file(), url() и кода, использующих их. К сожалению, это не может гарантировать, что к какому-либо конкретному https: URL-адресу можно получить доступ.... Различные методы доступа могут допускать различные протоколы или использовать частные пакеты сертификатов...

Помощник download.file() все еще говорит:

Добавленный пакет 'RCurl' предоставляет более широкие возможности для загрузки с URL-адресов.

который (кстати, включает управление файлами cookie и заголовками).

Основываясь на FAQ RCURL (найдите "Когда я пытаюсь взаимодействовать с URL-адресом через https, я получаю сообщение об ошибке" ), HTTPS URL-адресами можно управлять с помощью:

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

Вопросы

  • Как правильно использовать HTTPS в RCURL?
  • Что касается простой загрузки файлов (без заголовков, файлов cookie и т.д.), можно ли использовать RCURL вместо download.file()?
  • Является ли RCurl устаревшим, и мы должны выбрать curl?

Update

Проблема сохраняется с R версии 3.4.1 (2017-06-30) под Windows 10.

4b9b3361

Ответ 1

openssl в комплекте с RCurl в настоящее время является немного старым, что не поддерживает 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>