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證書路徑的可靠的跨平臺的方式?
感謝您的指點。我認爲最大的問題是工具(如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