Официальные заявления
В прошлом база 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.