R: descargar datos de forma segura utilizando TLS/SSL
curl ssl-certificate (1)
Declaraciones oficiales
En el pasado, la base R download.file()
no podía funcionar con protocolos HTTPS y era necesario usar RCurl. Desde R 3.3.0 :
Todas las construcciones tienen soporte para https: URLs en los métodos predeterminados para download.file (), url () y código haciendo uso de ellas. Lamentablemente, no se puede garantizar que se pueda acceder a una https: URL en particular. ... Diferentes métodos de acceso pueden permitir diferentes protocolos o usar paquetes de certificados privados ...
La ayuda de download.file()
todavía dice:
El paquete contribuido ''RCurl'' proporciona instalaciones más completas para descargar desde las URL.
que (por cierto incluye administración de cookies y encabezados).
Basado en las preguntas frecuentes de RCurl (busque "Cuando intento interactuar con una URL a través de https, obtengo un error"), las URL de HTTPS se pueden administrar con:
getURL(url, cainfo="CA bundle")
donde el CA bundle
es la ruta a un archivo de paquete de autoridad de certificado. Uno de esos paquetes está disponible desde el sitio curl en sí:
https://curl.haxx.se/ca/cacert.pem
Estado actual
Las pruebas se basan en plataformas de Windows
Para muchos sitios web HTTPS download.file()
funciona como se indica:
download.file(url="https://www.google.com", destfile="google.html")
download.file(url="https://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")
Con respecto a RCurl, usando el paquete cacert.pem
, descargado arriba, uno podría obtener un error:
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
En este caso, simplemente eliminar la referencia al paquete de certificados resuelve el problema:
getURL("https://www.google.com") # works
getURL("https://www.google.com", ssl.verifypeer=TRUE) # works
ssl.verifypeer = TRUE
se usa para garantizar que el éxito no se deba a que getURL()
suprima la seguridad. El argumento está documentado en RCurl FAQ .
Sin embargo, en otros casos, la conexión falla:
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
Y de manera similar, utilizando el paquete descargado anteriormente:
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
El mismo error ocurre incluso cuando se suprime la seguridad:
getURL("https://curl.haxx.se/ca/cacert.pem", ssl.verifypeer=FALSE)
# same error as above
Preguntas
- ¿Cómo usar HTTPS correctamente en RCurl?
- En lo que respecta a la mera descarga de archivos (sin encabezados, cookies, etc.), ¿hay algún beneficio en el uso de RCurl en lugar de
download.file()
? - ¿Es RCurl obsoleto y deberíamos optar por curl ?
Actualizar
El problema persiste a partir de la versión R 3.4.1 (2017-06-30) en Windows 10.
openssl incluido con RCurl es un poco viejo actualmente, que no es compatible con TLS v1.2
Sí, el paquete curl está bien
O puede usar el paquete httr que es un contenedor para el paquete 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>