php - 如何检查主机名是否与 PHP 中 SSL 证书中的 Common Name 匹配?

标签 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)) {
    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/

相关文章:

iis - IIS6有没有办法在同一个网站上同时做http和https?

php - GRPC 20908 ssl_transport_security.cc :1575] No match found for server name: 0. 0.0.0

php - 什么是 CURLOPT_FORBID_REUSE?

php - CURL setopt无法正常工作

PHP MySQL 每日结果表

javascript - eval ('1+1' ) 在 JavaScript 中有效,但在 PHP 中无效

php - 无法通过bizstrap表单使用php将数据提交到mysql数据库

PHP:将字符串转换为整数而不删除前导零

ssl - 我可以在 LAMP 堆栈 Wordpress 上生成 SSL 证书,然后将其移至 Bitnami 吗?

php - 服务器上的 http header 请求超时