Проблемы с RCurl и самоподписанным сертификатом

У меня возникают проблемы с получением функции RCurl getURL для доступа к URL-адресу HTTPS на сервере, который использует самозаверяющий сертификат. Я использую R 3.0.2 в Mac OS X 10.9.2.

Я прочитал FAQ и сверните страницу по этой теме. Итак, вот где я стою:

  1. Я сохранил копию сертификата на диск (~ / cert.pem).
  2. Я смог использовать этот же файл для подключения к серверу с помощью python-запросов и опции «проверить», и мне это удалось.
  3. curl в командной строке, похоже, игнорирует параметр --cacert. Мне удалось получить доступ к веб-сайту с его помощью после того, как я пометил сертификат как надежный с помощью приложения Mac OS X «Связка ключей».
  4. RCurl упорно отказывается подключаться к сайту со следующим кодом:

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

Вот результат, который я получаю:

* 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

Когда я протестировал и curl с параметром --cacert, и приведенный выше код RCurl на виртуальной машине Linux с тем же файлом cert.pem и точно таким же URL-адресом, он работал отлично.

Так что одинаковые тесты в Linux и Mac OS X, и только в Mac OS X они терпят неудачу. Даже добавление сертификата в связку ключей не помогло.

Единственное, что действительно работает, - это использование ssl.verifypeer=FALSE, но я не хочу этого делать по соображениям безопасности.

У меня здесь нет идей. У кого-нибудь еще есть предложения о том, как заставить это работать?


person asieira    schedule 26.02.2014    source источник
comment
Добавлен билет, чтобы узнать, дает ли автор отзыв: github.com/omegahat/RCurl/issues / 6   -  person asieira    schedule 28.02.2014
comment
Я пришел к выводу, что использование RCurl безнадежно. Например, читая исходный код, я понял, что не было предпринято никаких усилий, чтобы закрыть дескрипторы с помощью базового curl библиотеки на основе C, когда они были собраны мусором, что оставляет открытые соединения и вызывает исчерпание ресурсов, если вы используете его более чем на несколько простых загрузок (github.com/omegahat/RCurl/issues/8).   -  person asieira    schedule 24.03.2014
comment
Вместо этого я написал код Python, который использует запросы и grequests. Затем я написал небольшую оболочку R для внешнего вызова этого кода. Это дало огромный прирост производительности, я смог правильно использовать сертификат, и у меня не было проблем с нехваткой ресурсов.   -  person asieira    schedule 24.03.2014


Ответы (2)


Можешь попробовать:

library ("RCurl")
URL1 <- "https://data.mexbt.com/ticker/btcusd"
getURL(URL1,cainfo=system.file("CurlSSL","cacert.pem",package="RCurl"))
person IF.Francisco.ME    schedule 28.12.2015
comment
Я не тестировал это, так как больше не использую RCurl, но вариант cainfo curl, безусловно, лучший вариант. Хорошо поймал. - person asieira; 25.03.2016

Возвращаясь к этой проблеме, я просто хотел указать, что если вы все еще используете RCurl, вам следует использовать httr (который использует curl) вместо этого.

Я подтвердил, что использование config(cainfo="/path/to/certificate") с httr-соединениями будет работать должным образом.

person asieira    schedule 25.03.2016
comment
Обратите внимание, что config() является частью пакета httr, поэтому httr::config(cainfo="/path/to/certificate") работает, даже если вы не загружаете пакет httr. - person SaschaH; 11.06.2019