2014-10-20 70 views
70

我剛剛升級到OSX 10.10優勝美地和我自升級以來,我不能做捲曲POST到SSL網址了。curl POST HTTPS URL給SSLRead()錯誤

我第一次使用wordpress的wp_remote_request調用,並試圖在curl中使用php。 兩者(預期)給同樣的錯誤信息:

錯誤號碼:56

字符串錯誤:SSLRead()返回錯誤-9806

注:當我捲曲POST到HTTP它工作正常。 我認爲這是在PHP.ini或我的apache(我升級後失去了我原來的HTTPD.conf文件...)的設置。

任何人都可以幫我嗎?

+4

爲什麼會投票???這是我遇到的一個真正的問題,無法在Google找到任何好的解決方案 – Mattijs 2014-10-22 00:58:39

+0

澄清:我將本地MB上的POST捲曲到外部HTTPS APi – Mattijs 2014-10-24 04:01:15

+1

您可能已經得到了downvote,因爲雖然這是一個完全合理的問題,但它是脫離主題 - 它應該真的在Serverfault上。 – Synchro 2015-02-02 12:23:42

回答

141

我見過當PHP與和版本捲曲使用Apple's Secure Transport約塞米蒂下的URL請求的目標編譯器不支持的SSLv3(這是由於POODLE vulnerability可能禁用)這個錯誤發生。這個命令的輸出是什麼?

$ php -i | grep "SSL Version" 

我懷疑你會看到這一點:

SSL Version => SecureTransport 

您可以通過安裝PHP的版本,它使用一個版本的捲曲度,它使用OpenSSL的,而不是SecureTransport克服這一點。這很容易通過homebrew完成。所以如果你還沒有安裝它,那就先安裝它。如果安裝了自制軟件,但升級到優勝美地後還沒有運行brew update,請先執行此操作。還要確保你已經安裝了XCode> = 6.1和最新的XCode命令行工具。 brew doctor會告訴你,如果你做得很好。

添加自制水龍頭下面,你將需要爲了得到釀造的PHP安裝。如果這些回購已被點擊,請跳過此步驟。如果您不確定是否已經輕點這些回購,請運行以下命令。最壞的情況,你會得到一個無害的Warning: Already tapped!

$ brew tap homebrew/dupes 
$ brew tap homebrew/versions 
$ brew tap homebrew/php 

然後安裝捲曲使用OpenSSL:

$ brew install --with-homebrew-curl --with-httpd24 php55 

$ brew install --with-openssl curl 

然後使用您剛纔安裝的捲曲和釀造的OpenSSL安裝PHP

  • 如果使用apache,請確保將LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so添加到您的/etc/apache2/httpd.conf並重新啓動apache。

  • 如果不使用apache 2.4,可以從上面的命令中刪除--with-httpd24

  • 如果使用nginx的,遵循開始FPM告誡instuctions:

    要在啓動時啓動PHP-FPM:

    mkdir -p ~/Library/LaunchAgents 
    cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/ 
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist 
    

安裝任何PHP擴展你需要例如。 mcrypt

$ brew install php55-mcrypt 

大功告成後,再次運行此:

$ php -i | grep "SSL Version" 

,你應該看到:

SSL Version => OpenSSL/1.0.2h 

而現在,重新測試你的應用程序和SSLRead() return error -9806應該走開。

+2

嗨亞薩, 是的,我有SSL版本=> SecureTransport。我有Brew,只是想知道如果用Brew安裝會覆蓋我當前的PHP,還是會添加另一個PHP版本,這樣我必須禁用到股票版本?也感謝您的徹底解答。我不會發現自己,具體問題 – Mattijs 2014-10-24 03:57:08

+0

這是我得到的openssl信息:'新的,TLSv1/SSLv3,密碼是RC4-MD5 服務器公鑰是2048位 安全重協商IS支持 壓縮:無 擴展:NONE SSL會話: 協議:使用TLSv1 密碼:RC4,MD5 會話ID:0B220000E93AF2E279F784D25D6FC08675E63F983424A4296BEBE59AF89F3E7C 會話ID-CTX: 主密鑰:4B0BFE2ECC5624D0E3A2AD44FF6DC30F25E0C4889C6CA5EF0D0E90C1469D70C9D6B5321A4B2C1A084355A79A013C4420 重點精氨酸:無 開始時間:1414123290 超時:300(秒) 驗證返回代碼:0(ok)' – Mattijs 2014-10-24 04:02:52

+0

@Mattijs Homebrew將所有軟件安裝到'/ usr/local'並且不會觸及OSX的php。只要'/ usr/local/bin'出現在系統'$ PATH'環境變量的'/ usr/bin'之前,系統就會使用brew的php版本。如果你卸載brew的php,那麼你的系統會回到'/ usr/bin'中使用php二進制文件。 – Asaph 2014-10-24 05:14:29

4

此SSL錯誤(OSStatus代碼:9806)表示由於建立連接時出現錯誤(例如,某些無效命令),您的連接被服務器終止。這似乎只發生在與遠程主機的SSL連接中斷時。

這不是很好的SSL手動(SSL_get_error)記錄,但此錯誤消息來自libcurl建造它使用的SecureTransport/Darwinssl TLS後端(你可以找到它的OSStatus在SecureTransport.h頭文件):

errSSLClosedAbort   = -9806, /* connection closed via error */ 

從我的經驗來看,這通常發生在代理的後面或連接到使用認證機制的有限網絡上。

因此,請確認您已連接到正確的網絡(通過WiFi)並且其他HTTPS正常工作。如果沒有,請檢查您是否需要指定代理憑證,或者您的ISP重寫證書鏈並需要某種身份驗證,或者它基本上阻止訪問其防火牆中的某些站點。

1

我有一個類似的問題,SSLRead() return error -9806錯誤,我也有SSL Version => SecureTransport

但在我的情況下,問題是,我是設置捲曲CURLOPT_HTTP_VERSION選項:

$curl = curl_init();  
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); 

如果刪除選項,捲曲將決定默認使用哪個版本。有關更多信息,請參閱curl_setopt文檔。

這對我很有用,我不需要用cURL或PHP來改變任何東西。但這是error -9806出現的許多情況之一的解決方案。