r ssl curl ssl-certificate rcurl

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

  1. ¿Cómo usar HTTPS correctamente en RCurl?
  2. 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() ?
  3. ¿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>