2017-02-20 18 views
0

С помощью этого PHP скриптКак проверить, совпадает ли имя хоста с общим именем в сертификате SSL в PHP?

<?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, вы будете принимать любые сертификаты независимо от того, был ли он выпущен локально доверенным ЦС или нет. И это не поможет вам установить CURLOPT_SSL_VERIFYHOST, потому что с учетом обеих настроек вы примете самозаверяющий сертификат на имя sf.net, что делает человека в середине атаки тривиальным.

+0

Благодарим вас за эти объяснения. Вы имеете в виду, что я должен установить 'CURLOPT_SSL_VERIFYPEER' значение TRUE и' CURLOPT_SSL_VERIFYHOST'to 0? – LeMoussel

+0

@LeMoussel: для правильной проверки вы должны оставить оба в том, что, как мы надеемся, по умолчанию в вашей системе, это [verifypeer true] (https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) и [verifyhost 2 ] (https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) –