2016-06-30 6 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.RCurl의 TLS v1.1/TLS v1.2 지원

배경 : rforcecom 패키지를 사용하여 Salesforce와 수개월 통신했습니다. Salesforce는 최근 TLS v1.0에 대한 지원을 중지했으며 샌드 박스에서 TLS v1.1 이상을 요구합니다. 이 업데이트는 생산 환경에서 2017 년 3 월에 실시됩니다.

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) 

내가 언급 한 바와 같이이, 잠시 동안 나를 위해 일하고있다. 난, 나는 패키지의 로컬 복사본에 구현하지 않고 (수정 및 공급 한

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

: 이제 세일즈 포스 샌드 박스에 TLS v1.0을 비활성화했다고하지만, 다음과 같은 오류와 함께 실패 RForcecom에 대한 로그인 모듈의 로컬 복사본을 변경 한 경험이 있습니다. 실험을 통해 sslversion=SSLVERSION_TLSv1, sslversion=SSLVERSION_SSLv3 등을 추가하여 SSLVERSION의 기존 열거 값을 성공적으로 지정할 수 있음을 발견했습니다. 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 

내가 확인한 내 libcurl 버전이 https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html에 따라 해당 옵션을 지원하는 7.40.0 인 curlVersion()이 있습니다. 그러나 RCurl을 인식 할 수 없습니다.

이 시점에서 내가 찾고있는 것은 TLS v1.1 또는 TLS v1.2를 사용하는 RCurl을 얻는 방법이며, 내가 얻을 수있는 도움에 대해 매우 감사 할 것입니다. 어떤 질문/문제로 인해 사과를 드리는 것은 처음입니다. 이전에는 항상 다른 사람들의 질문과 답변을 읽으면서 혼란 스러울 수있었습니다.

답변

0

RCurl은 libcurl에 대한 인터페이스이며 후자에 따라 다릅니다. libcurl이 TLS v1.1 또는 v.1.2를 지원하지 않는 이전 버전의 OpenSSL로 빌드되었을 수 있습니다. 귀하는 다음과 같이 R에서 SSL 버전을 확인할 수 있습니다

RCurl::curlVersion()$ssl_version 

나는 기본적으로 (예를 들어, SSL 옵션 CURL_SSLVERSION_DEFAULT)에 의해, SSL 핸드 쉐이크 동안, 서버와 클라이언트가 최신 버전 둘 다 지원에 동의 것이라고 생각합니다. 작동하게하려면 OpenSSL을 최신 버전으로 업데이트하고 libcurl을 다시 컴파일 한 다음 RCurl을 다시 빌드하여 업데이트를 등록해야합니다.

즉, 사용자가 직접 필요한 옵션의 정수 값을 전달하여 RCurl에 정의되지 않은 특정 ssl 버전을 적용 할 수 있습니다.예를 들어

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 curl header file on GitHub에 정의 된 C enum에서 추론 할 수있는 컬의 저자가 결정할 수 있기 때문에 일반적으로

# 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) 

이 좋은 연습을하지 않을 수 있습니다 값을 바꾸려면 (비록 내가 기회가 낮다고 생각 하긴하지만) 그 옵션에는 있습니다.