如何在PHP中检查主机名是否与SSL证书中的公用名匹配?

如何在PHP中检查主机名是否与SSL证书中的公用名匹配?,php,ssl,curl,Php,Ssl,Curl,使用这个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)) {

使用这个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颁发。设置代码> CuropoptsSLVIVIFIHOST 将无效,因为这两种设置结合起来,您将接受一个自签名证书,该名称为代码> Sf.NET<代码>,这使得中间人攻击微不足道。

< P>如果您访问SF.NET,您将获得SF.NET证书而不是SooCurfGe.NET。sf.net的证书具有CN
*.sf.net
和SAN
DNS:*.sf.net、DNS:sf.net
两种形式。这意味着证书与URL匹配。不要因为以下重定向到
sourceforge.net
而感到困惑,因为在此重定向中,它将获得一个对新目标有效的新证书


除此之外,通过将
CURLOPT_SSL_VERIFYPEER
设置为false,您将接受任何证书,无论其是否由本地受信任的CA颁发。而且,设置代码> CurLoptTSLVIVIFIHOST 将是无济于事的,因为这两种设置结合起来,您将接受一个名为“代码> Sf.NET的自签名证书,这使得中间人攻击微不足道。

谢谢您的解释。您是说我必须将<代码> CuropoptsSLVIVIFIFY Peer-<代码>设置为真吗?
CURLOPT\u SSL\u VERIFYHOST
到0?@LeMoussel:为了正确验证,您应该将两者保留在系统的默认值,谢谢您的解释。您的意思是我必须将
CURLOPT\u SSL\u VERIFYPEER
设置为TRUE,并将
CURLOPT\u SSL\u VERIFYHOST
设置为0吗?@LeMoussel:为了进行正确的验证,您应该将两者都保留在系统的默认值,即和