2017-10-08 169 views
0

我有一個奇怪的情況,即開始使用libcurl的在Windows上運行請求,但給出了OSX證書錯誤(」 SSL同行握手失敗,服務器最有可能需要客戶端證書連接「)libcurl的SSL連接錯誤

奇怪的部分是,如果我在終端使用curl嘗試相同的請求(仍然在OSX上),它工作正常。

我使用的唯一的SSL相關的選項

curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0); 
curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 0); 

如何解決這一問題?

Win7 curl version: 7.46 
OSX Sierra curl version: 7:54 
+0

採取任何證書包窗口使用,並將其複製到OSX並告訴curl使用它與CURLOPT_CAINFO?儘管你很可能使用這個1:https://curl.haxx.se/docs/caextract.html – hanshenrik

+0

@hanshenrik,並且應用程序的用戶也必須這樣做?這對我來說看起來並不正確 – user1233963

+0

不,不然,您可以隨應用程序發送適當的證書包。 – hanshenrik

回答

1

嘗試使用詳細輸出-v)使用curl從OS X的bash。它應該給你關於CA捲曲信息使用,如文檔中說verbose section

如果我們使用HTTPS:// URL,而不是HTTP之一,也將有線條的一大堆解釋卷曲如何使用CA證書來驗證服務器的證書以及服務器證書中的一些細節等。包括選擇哪些密碼和更多TLS細節。

編輯:here是我下面的評論中解釋,在 「限制」:

DarwinSSL:如果驗證值是0,那麼SNI也將被禁用。 SNI是將主機名發送到服務器的TLS擴展。服務器可以使用該信息來執行諸如爲主機名發回特定證書或將請求轉發到特定源服務器等。如果沒有發送SNI,某些主機名可能無法訪問。

這裏的問題是,捲曲使用DarwinSSL爲OS X,當CURLOPT_SSL_VERIFYHOST設置爲0嘗試發送請求,而不禁用這兩個OPTS其中有一些主機名的限制。

+0

這是我得到的輸出https://pastebin.com/jb3mELjH。哪一個是客戶端證書? – user1233963

+0

我看了一下捲曲源。這是引發錯誤的代碼片段。 https://github.com/curl/curl/blob/master/lib/vtls/darwinssl.c#L2326 您是否嘗試過評論您在問題中顯示的兩條線?也許你明確地告訴curl不要驗證host和peer,DarwinSSL不支持DarwinSSL,這是基於Darwin的OS的TLS實現。 嘗試不禁用驗證。 – NoImaginationGuy

+0

該限制是由DarwinSSL的API引起的,因此捲曲可以做很多事情...... –