2017-02-20 105 views
0

使用此PHP腳本如何檢查主機名稱是否與PHP中的SSL證書中的通用名稱匹配?

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_URL, 'https://sf.net/'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
if (!curl_exec($ch)) { 
    echo "Error #" . curl_errno($ch) . ": " . curl_error($ch); 
} 
?> 

我沒有錯誤。這似乎是好的。

預期結果應該顯示一條錯誤消息,指出證書名稱sourceforge.net與期望的sf.net不符。你怎麼看?

回答

2

如果您訪問sf.net,您將獲得sf.net的證書而不是sourceforge.net。 sf.net的證書有CN *.sf.net和SAN DNS:*.sf.net, DNS:sf.net。這意味着證書與URL匹配。不要從以下重定向到sourceforge.net,因爲在這個重定向它會得到一個新的證書是有效的新目標。

除此之外,通過將CURLOPT_SSL_VERIFYPEER設置爲false,您將接受任何證書,而不管它是否由本地可信CA頒發。並且這對你設置CURLOPT_SSL_VERIFYHOST沒有幫助,因爲在兩種設置相結合的情況下,你將接受名爲sf.net的自簽名證書,這使得中間人攻擊變得微不足道。

+0

謝謝你的解釋。你的意思是我必須設置'CURLOPT_SSL_VERIFYPEER'爲TRUE,'CURLOPT_SSL_VERIFYHOST'爲0? – LeMoussel

+0

@LeMoussel:爲了正確驗證,您應該保留系統默認的[verifyypeer true](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html)和[verifyhost 2 ](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) –

相關問題