2016-06-30 7 views
0

ETA: Per https://github.com/hiratake55/RForcecom/issues/42 , it looks like the author of the rforcecom package has updated rforcecom to use httr instead of RCurl (as of today, to be uploaded to CRAN tomorrow, 7/1/16), so my particular issue will be solved at that point. However, the general case (implementing TLS 1.1/1.2 in RCurl) may still be worth pursuing for other packages. Or everyone may just switch to the more recent curl package instead of RCurl.TLS v1.1/TLS v1.2 поддержка в RCURL

Справочная информация. Я использую пакет rforcecom для связи с Salesforce в течение нескольких месяцев. Недавно Salesforce отключила поддержку TLS v1.0 и требует TLS v1.1 или выше в своих песочницах; это обновление будет выполнено для производственных сред в марте 2017 года.

rforcecom использует RCURL для связи с серверами salesforce.com. Как правило, используется метод curlPerform, который реализуется что-то вроде этого (этот пример из rforcecom.login.R):

h <- basicHeaderGatherer() 
t <- basicTextGatherer() 
URL <- paste(loginURL, rforcecom.api.getSoapEndpoint(apiVersion), sep="") 
httpHeader <- c("SOAPAction"="login","Content-Type"="text/xml") 
curlPerform(url=URL, httpheader=httpHeader, postfields=soapBody, headerfunction = h$update, writefunction = t$update, ssl.verifypeer=F) 

Это работает для меня на некоторое время, как я уже говорил. Теперь, когда Salesforce отключил TLS v1.0 на Песочницах, однако, он не со следующей ошибкой:

UNSUPPORTED_CLIENT: TLS 1.0 has been disabled in this organization. Please use TLS 1.1 or higher when connecting to Salesforce using https. 

Я модифицированная и соерседом (без ее реализации в локальной копии пакета, так как я недостаточно опыта для этого), изменение моей локальной копии модуля входа в систему для RForcecom, и я обнаружил через эксперименты, что могу указать любое из существующих перечисленных значений для SSLVERSION успешно, добавив sslversion=SSLVERSION_TLSv1, sslversion=SSLVERSION_SSLv3 и т. д. к curlPerform, где он вызывается. Однако все они дают мне ту же ошибку, что и выше. При попытке использовать один из вариантов, который реализуется в Libcurl, но не в RCurl (SSLVERSION_TLSv1.1, SSLVERSION_TLSv1.2), я получаю следующее сообщение об ошибке:

Error in merge(list(...), .opts) : object 'SSLVERSION_TLSv1.1' not found 

или:

Error in merge(list(...), .opts) : object 'SSLVERSION_TLSv1.2' not found 

Я проверял с curlVersion(), что моя версия libcurl - 7.40.0, которая согласно https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html поддерживает эти параметры. Тем не менее, я не могу заставить RCurl распознавать их.

На этом этапе я хочу, чтобы RCURL использовал TLS v1.1 или TLS v1.2, и я был бы очень признателен за любую помощь, которую я могу получить с этим. Я извиняюсь за любые проблемы/проблемы с моим вопросом, так как это мой первый раз, когда я спрашиваю об этом сам, мне до этого всегда приходилось путаться, читая вопросы и ответы других людей.

ответ

0

RCURL - это интерфейс для libcurl, и то, что он поддерживает, зависит от последнего. Возможно, ваш libcurl был построен с более старой версией OpenSSL, которая не поддерживает TLS v1.1 или v.1.2. Вы можете определить версию SSL из R, как это:

RCurl::curlVersion()$ssl_version 

Я думаю, что по умолчанию (например, вариант SSL CURL_SSLVERSION_DEFAULT), во время SSL рукопожатия, сервер и клиент согласится на новую версию, что они оба поддерживают. Чтобы заставить его работать, вам придется обновить OpenSSL до более новой версии, перекомпилировать libcurl с ним и перестроить RCurl, чтобы он регистрировал обновления.

Таким образом, вы можете принудительно ввести определенную версию ssl, не определенную в RCurl, передав целочисленное значение требуемого параметра самостоятельно.Числа вы ищете могут быть выведены из C enum, определенных в the curl header file on GitHub:

enum { 
    CURL_SSLVERSION_DEFAULT, // 0 
    CURL_SSLVERSION_TLSv1, /* TLS 1.x */ // 1 
    CURL_SSLVERSION_SSLv2, // 2 
    CURL_SSLVERSION_SSLv3, // 3 
    CURL_SSLVERSION_TLSv1_0, // 4 
    CURL_SSLVERSION_TLSv1_1, // 5 
    CURL_SSLVERSION_TLSv1_2, // 6 
    CURL_SSLVERSION_TLSv1_3, // 7 

    CURL_SSLVERSION_LAST /* never use, keep last */ // 8 
}; 

Например:

# the data of you post request 
nameValueList = list(data1 = "data1", data2 = "data2") 

CURL_SSLVERSION_TLSv1_1 <- 5L 
CURL_SSLVERSION_TLSv1_2 <- 6L 

# TLS 1.1 
opts <- RCurl::curlOptions(verbose = TRUE, 
          sslversion = CURL_SSLVERSION_TLSv1_1, ...) 

# TLS 1.2 
opts <- RCurl::curlOptions(verbose = TRUE, 
          sslversion = CURL_SSLVERSION_TLSv1_2, ...) 

# finally, POST the data 
RCurl::postForm(URL, .params = nameValueList, .opts = opts) 

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