2017-02-20 106 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) –

相关问题