2014-03-28 125 views
0

PHP(與Python直到最近一樣)有一個長期的安全問題,因爲它使用SSL/TLS的所有函數都不執行證書驗證,所以只要站點提供某種有效證書,它將被允許​​,即使它沒有被已知的CA簽名,或者與域不匹配。這當然意味着它容易受到中間人攻擊。什麼是從PHP獲取OpenSSL的CAPath的可靠方法?

PHP 5.6解決了的this PHP RFC落實這個問題。這方面的一個重要組成部分是新的php.ini財產openssl.capath指向那是在主機平臺上的OpenSSL的一部分由PHP的作爲capath屬性(docs)SSL流環境中使用CA證書文件夾,即可。 A second RFC增加了一個功能openssl_get_cert_locations(),使其更容易。

,對於PHP 5.6是偉大的,但找到CA證書路徑是不是解決了早期版本的一個簡單的問題,這意味着每個人,因爲5.6尚未發佈。

在大多數Linux發行版上,此路徑爲/etc/ssl/certs,但對於在Windows,BSD,OS X等平臺上運行的便攜式代碼,這不是一個可靠的假設。OS X對此尤其麻煩,因爲OS X上的OpenSSL不存儲CA證書在文件系統中,但在系統鑰匙串中。

這當然是很容易解決任何具體的平臺,因爲你可以設置什麼是您的服務器上適當的,但在這種情況下,它會針對與使用所有的地方一些非常流行的庫代碼。

任何人都可以提出尋找CA證書路徑的可靠的跨平臺的方式?

回答

2

起初,我要感謝你意識到的證書應該進行檢查。不幸的是,大多數人只是在不安全的默認情況下生活,並且很高興沒有錯誤發生。

但是對於你的問題: OpenSSL不使用OS X上的鑰匙串(另請參閱http://landonf.bikemonkey.org/code/macosx/certsync.20130514.html)。的所有平臺的OpenSSL確定的默認位置以相同的方式(參見OpenSSL的源加密/ cryptlib.h):

  • 含有證書指紋(例如ff588423.0等)的默認目錄是環境的任一值變量SSL_CERT_DIR或OPENSSLDIR/certs /,其中OPENSSLDIR是在編譯時配置的。您可以通過調用命令openssl version -d或調用函數SSLeay_version(5)來獲得OPENSSLDIR的值,該函數在PHP中也應該可用。
  • 相似或者通過環境變量SSL_CERT_FILE或OPENSSLDIR/cert.pem
  • 兩個位置(DIR和文件)指定包含CAS默認文件可以並行

這些設置可以使用通常工作在Linux上和* BSD系統,因爲他們的證書安裝在預期的位置,但在Windows和OSX上失敗,這些證書管理的證書管理與openssl不兼容。因此,在這個平臺上,您需要找到一種轉換內置CA的方式,或者僅使用Mozilla的CA捆綁包轉換爲PEM。您可以在http://curl.haxx.se/ca/cacert.pem

編輯發現這一點:我剛讀,即在OS X原生的OpenSSL是由蘋果修補以增加對TEA支持(例如集成到鑰匙圈)。雖然它被添加的方式是錯誤的,詳情請參見https://hynek.me/articles/apple-openssl-verification-surprises/

+0

感謝您的指點。我認爲最大的問題是工具(如PHP)不會抱怨未經驗證的證書。我猜OS X的差別不在於OpenSSL不使用鑰匙串,而是OS X不使用OpenSSL(或者它會遇到同樣的問題)。我其實[寫了一個腳本](http://apple.stackexchange.com/questions/95538/how-to-fix-curl-throwing-error-setting-certificate-verify-locations/124954#124954)將CA certs最近剛從這個鑰匙鏈出口。 – Synchro

相關問題