Получите контент сайта через 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 по умолчанию.