2012-10-17 135 views
17

我想用cURL發佈到剛剛開始使用SNI的API(以便他們可以在1個IP地址上託管多個ssl證書)。使用cURL與SNI(服務器名稱指示)

由於此舉遷移至SNI,我的cURL停止工作。他們解釋說,這是因爲cURL獲取* .domain-a.com而不是* .domain-b.com,所以SSL失敗。

這似乎是cURL中的錯誤,因爲當從瀏覽器訪問API URL時沒有錯誤。

使用此代碼,它的工作:

exec('curl -k -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

但是,使用-k是不好的,因爲它不驗證SSL證書。

使用此代碼,不工作:

exec('curl -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

所以我的問題是,我該如何使用捲曲符合SNI,仍然驗證SSL(沒有使用-k)。 PHP中是否有另一個設置或我可以設置的捲曲選項來解決此問題?

回答

44

爲了能夠使用SNI,需要三個條件:

  • 使用版本捲曲的支持它,至少7.18.1,根據change logs
  • 使用針對支持SNI的庫編譯的Curl版本,例如OpenSSL 0.9.8j(取決於編譯選項的一些舊版本)。
  • 至少使用TLS 1.0(不SSLv3)。

需要注意的是捲曲的調試代碼(-v)只顯示主版本號(主要的SSLv2和SSLv3的+消息類型之間的區別,見ssl_tls_trace),所以當你使用TLS 1.0它仍然會顯示「的SSLv3」或以上(因爲它們實際上是SSL v3.1或更高版本,3是相同的主要版本號)。

您可以檢查您安裝的curl版本是否可以使用Wireshark使用SNI。如果使用curl -1 https://something進行連接,如果展開「客戶端問候」消息,則應該能夠看到「server_name」擴展名。

我不知道該SSL/TLS版本默認情況下使用(取決於你的編譯選項)當您使用curl沒有-1(用於TLS 1.0)或-3(用於在SSLv3),但你可以嘗試強制-1在你的命令上,因爲它無論如何都不能用於SSLv3。

+0

如果要使用libcurl,請將'CURLOPT_SSLVERSION'設置爲'1'(相當於命令行中的'-1')。 – Bruno

+0

對我而言,它安裝的是cURL的舊版本。更新它修復了它。 – Justin

+3

順便說一句,關於SO的一個很好的答案很好的例子。謝謝 –

相關問題