2014-02-26 7 views
7

Ich habe Probleme bekommen RCurl Funktion getURL Zugriff auf eine HTTPS-URL auf einem Server, der ein selbstsigniertes Zertifikat verwendet. Ich verwende R 3.0.2 unter Mac OS X 10.9.2.RCurl und selbstsigniertes Zertifikat Probleme

Ich habe die FAQ und die curl page über das Thema gelesen. Also das ist, wo ich stehe:

  1. Ich habe eine Kopie des Zertifikats auf der Festplatte (~/cert.pem) gespeichert.
  2. Ich war in der Lage, diese sehr gleiche Datei verwenden, um eine Verbindung zum Server mit Python-Anfragen und die Option 'Verify', und erfolgreich.
  3. curl auf der Kommandozeile scheint die Option --cacert zu ignorieren. Es ist mir gelungen, auf die Website zuzugreifen, nachdem ich das Zertifikat mit der Mac OS X "Keychain Access" -App als vertrauenswürdig gekennzeichnet habe.
  4. RCurl hartnäckig weigert sich, die Website mit dem folgenden Code zu verbinden:

    getURL ("https://somesite.tld", verbose = T, cainfo = normalizePath ("~/cert.pem"))

Dies wird den Ausgang I erhalten:

* Adding handle: conn: 0x7f92771b0400 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 38 (0x7f92771b0400) send_pipe: 1, recv_pipe: 0 
* About to connect() to somesite.tld port 443 (#38) 
* Trying 42.42.42.42... 
* Connected to somesite.tld (42.42.42.42) port 443 (#38) 
* SSL certificate problem: Invalid certificate chain 
* Closing connection 38 

Wenn ich beide curl mit der --cacert Option und dem RCurl Code oben in einem Linux-VM mit der gleichen cert.pem Datei und exakt gleicher URL getestet, es hat perfekt funktioniert.

So gleiche Tests unter Linux und Mac OS X, und nur unter Mac OS X scheitern sie. Sogar das Hinzufügen des Zertifikats zum Schlüsselbund hat nicht funktioniert.

Das einzige, was funktioniert, ist die Verwendung ssl.verifypeer=FALSE, aber ich möchte das nicht aus Sicherheitsgründen tun.

Ich habe keine Ideen hier. Hat noch jemand Vorschläge, wie man das zum Laufen bringt?

+0

Ein Ticket hinzugefügt, um zu sehen, ob der Autor mir ein Feedback gibt: https://github.com/omegahat/RCurl/issues/6 – asieira

+0

Ich bin zu dem Schluss gekommen, dass RCurl hoffnungslos ist. Wenn ich zum Beispiel den Quellcode lese, merke ich, dass keinerlei Anstrengungen unternommen wurden, um die Griffe mit der zugrunde liegenden C-basierten Libelle zu schließen, wenn sie Müll gesammelt wurden, was offene Verbindungen verursacht und eine Erschöpfung der Ressourcen verursacht, wenn man sie für mehr als einen benutzt einige triviale Downloads (https://github.com/omegahat/RCurl/issues/8). – asieira

+0

Ich habe stattdessen etwas Python-Code geschrieben, der [Anfragen] (http://docs.python-requests.org/en/latest/) und [grequests] (https://github.com/kennethreitz/grequests) verwendet. Dann schrieb ich einen kleinen R-Wrapper, um diesen Code extern aufzurufen. Dies führte zu einem enormen Leistungszuwachs, ich konnte das Zertifikat korrekt verwenden und hatte keine Ressourcenerschöpfungsprobleme. – asieira

Antwort

0

zurück zu dieser Frage kommend Ich wollte nur darauf hinweisen, dass, wenn Sie noch RCurl verwenden, sollten Sie httr verwenden (was curl verwendet) statt.

Ich habe bestätigt, dass die Verwendung von config(cainfo="/path/to/certificate") mit HTTR-Verbindungen wie vorgesehen funktioniert.

1

Sie können versuchen:

library ("RCurl") 
URL1 <- "https://data.mexbt.com/ticker/btcusd" 
getURL(URL1,cainfo=system.file("CurlSSL","cacert.pem",package="RCurl")) 
+0

Ich habe dies nicht getestet, da ich RCurl nicht mehr verwende, aber die Cainfo-Curl-Option ist sicherlich der richtige Weg. Netter Fang. – asieira