2015-06-04 145 views
0

我有一臺FreeBSD服務器 FreeBSD hotspot.brightlan.net 6.2-RELEASE-p6 FreeBSD 6.2-RELEASE-p6#0:Sat Jul 21 13:42:25 EDT 2007錯誤:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:證書驗證失敗

在這臺服務器上,我有一個應用程序在PHP中使用curl通過他們的API連接到Authorize.net。最近他們更新了他們的SSL證書以支持sha256,因此SSL證書也發生了變化。此更改後,應用程序無法連接。如果我做了 curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,FALSE) 它連接成功,但我想在SSL握手期間完全驗證服務器。 我已經注意到,通過指定使用CURLOPT_CAINFO選項更新ca證書文件後,同樣從不同的Linux ubuntu服務器獲取連接。

但在這個FreeBSD的,它不會連接。我還注意到SSL證書是以通配符(即* .authorize.net)頒發的。因此,在Ubuntu服務器上,我也必須禁用CURLOPT_SSL_VERIFYHOST。但是在這個FreeBSD服務器上,它甚至不能使用這個選項。 (cgi-fcgi)(built:May 4 2007 13:35:10)

任何幫助表示讚賞。

回答

0

我終於發現,OpenSSL的版本的版本是背後的問題。直到0.9.8o才支持SHA256。所以我試着將openssl升級到最新版本。由於我的系統相當老舊,最新版本不受支持。 所以我開始成功編譯0.9.8o,但它在內部使用時會破壞SSH。所以我現在的目標是在不破壞SSH服務器的情況下將openssl升級到0.9.8o。

我開始挖掘了一下,找到了鏈接不同版本的Openssl的方法,正如上面「Steffen Ullrich」所提到的。我能夠靜態和動態地編譯和鏈接openssl 0.9.8o,並在觀察下發現。

當我們在啓用openssl的情況下編譯php時,curl不會使用其鏈接的openssl連接到該網站。在這裏,我編譯了兩個php以及用單獨版本的openssl進行卷曲(我甚至嘗試了用靜態openssl編譯和鏈接curl)。這與PHP中使用編譯爲優先,同時連接到該網站,因此OpenSSL的版本不能在我的情況下連接(由於SHA256 SSL證書&的PHP的OpenSSL 0.9.7e)。 但是,如果我用更高版本的openssl(0.9.8o)重新編譯php,那麼它可以連接。另外,如果我在不啓用openssl的情況下編譯php,那麼curl能夠連接,因爲它使用了鏈接的openssl 0.9.8o。

我不知道這是一個錯誤還是本意是像這樣在PHP中,或者可能固定在最新的可用版本的PHP /捲曲。

但我認爲從curl的角度來看,使用與php連接的openssl版本來連接網站是不正確的。它應該使用其鏈接的openssl版本(0.9.8o)連接到該網站。如果有人連接到網站,則應使用鏈接到php的openssl(0.9.7e)版本。

0

請注意,您運行的是一個非常古老的系統不再支持,可能已經積累了大量的安全問題。我不確定,但我認爲這個版本的FreeBSD帶有openssl 0.9.7,它太舊了,不能支持使用SHA-256簽名的證書。

openssl version檢查您的版本,看看https://support.globalsign.com/customer/portal/articles/1499561-sha-256-compatibility

+0

感謝您的回覆。我知道它是一箇舊系統,我已經知道我需要升級openssl。我也這樣做了,並且在類似的(測試)設置上工作良好。現在的困難,現在是把它連接起來,使它不會打破別人。例如,如果我鏈接它,它會中斷ssh服務。我不想在生產系統上破壞事情。 –

+0

編譯openssl以指定安裝路徑時存在構建選項,以便它與系統安裝不衝突。 curl似乎有類似的選項,您可以指定要使用的SSL庫的路徑。如果將這些組合在一起,則可以使用自定義SSL構建捲曲,而不會使用本地安裝進行推斷。請查看相關的源代碼分發文件,例如INSTALL,這些文件通常會更詳細地描述此過程。 –

相關問題