2016-06-30 17 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. 

:今、Salesforceはサンドボックス上でTLS v1.0のを無効にしていること、しかし、それは次のエラーで失敗しますRForcecomのログインモジュールのローカルコピーに変更がありました。実験で、SSLVERSIONの既存の列挙値のいずれかを指定することができました。sslversion=SSLVERSION_TLSv1sslversion=SSLVERSION_SSLv3などをcurlPerformオプションが呼び出される場所。しかし、これらのすべてが私に上記と同じエラーを与えます。

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

か::私はlibcurlのではなく、RCurl(SSLVERSION_TLSv1.1SSLVERSION_TLSv1.2)に実装されているオプションのいずれかを使用しようとすると、私は次のエラーを取得

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

を私が確認しましたcurlVersion()と私のlibcurlバージョンは、https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.htmlによると、これらのオプションをサポートしています7.40.0です。しかし、RCurlに認識させることができません。

私が探しているのは、RCurlにTLS v1.1またはTLS v1.2を使用させる方法です。私がそれを得るための援助を感謝します。私は最初に自分自身に質問しているので、私は以前は常に他の人の質問と回答を読むことによって混乱することができたので、私は問題の問題/問題のために私の質問にお詫び申し上げます。

答えて

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から推定することができるのcURLの著者が決める可能性があるため、一般的には

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

、これは良い習慣ではないかもしれません(私はチャンスは低いと信じていますが)値を変更するには、それらのオプションがあります。

関連する問題