用这个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
不匹配。你怎么看?
最佳答案
如果您访问 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
的自签名证书,这使得中间人攻击变得微不足道.
关于php - 如何检查主机名是否与 PHP 中 SSL 证书中的 Common Name 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42343221/