Получите контент сайта через SSL с помощью httr в R

Я пытаюсь получить массив JSON с моего сервера, используя метод HTTP POST в R.

Я пытался использовать оба POSTфункция от httrи getURLфункция от RCurl но оба возвращают ошибки.

cafile <- system.file("CurlSSL", "cacert.pem", package = "RCurl")
url    <- "https://example.com/query/getData.php"

POST(url,body=NULL)
POST(url,body=NULL,config(cainfo=cafile))

getURL(url)
getURL(url,cainfo=cafile)

Ошибка, данная POST Функция есть (для обоих вызовов):

Error in curl::curl_fetch_memory(url, handle = handle) : 
  SSL peer certificate or SSH remote key was not OK

Ошибка, данная getURL функция есть (без config(cainfo=cafile)):

* Hostname was NOT found in DNS cache
*   Trying 162.xxx.xxx.xxx...
* connect to 162.xxx.xxx.xxx port 443 failed: Connection refused
*   Trying 130.yyy.yyy.yyy...
* Connected to example.com (130.yyy.yyy.yyy) port 443 (#0)
* found 175 certificates in /etc/ssl/certs/ca-certificates.crt
* gnutls_handshake() warning: The server name sent was not recognized
* failed to get server cert
* Closing connection 0
Error in function (type, msg, asError = TRUE)  : 
  gnutls_handshake() warning: The server name sent was not recognized

Я подозреваю, что это как-то связано с R после запуска:

curl 'https://example.com/query/getData.php'

из командной строки вернуть ожидаемый результат.

Сервер является сервером apache2 с сертификатом COMODO SSL. В /etc/apache2/sites-enabled/000-default.conf имя сервера установлено на

ServerName www.example.com  

Любая помощь будет наиболее ценной

2 ответа

httr Пакет включает в себя собственный CA-пакет, так что это, вероятно, не проблема. Скорее всего, проблема конфигурации SNI на стороне сервера или проблема с вашим сертификатом

К сожалению, вы не опубликовали воспроизводимый пример с реальным URL. Но с последней версией нового пакета openssl вы можете легко отладить сертификат вашего сервера:

library(openssl)
cert <- download_ssl_cert("www.r-project.org")
print(cert)
print(as.list(cert[[1]]))

Также попробуйте подтвердить это

cert_verify(cert, ca_bundle())

Это может дать подсказку о том, что не так с вашим сертификатом.

Кажется, что меняется

ServerName www.example.com

к

ServerName example.com

исправил эту проблему. Я попробовал это решение с другого компьютера, и я смог использовать функцию httr POST с этим исправлением с пакетом httr CA по умолчанию.

Другие вопросы по тегам