【问题标题】:PHP Client to verify https certificatesPHP客户端验证https证书
【发布时间】:2011-10-04 14:50:10
【问题描述】:

我需要创建一个 php,它将充当客户端并在 https 下使用一些 Web 服务。 我的问题是我还想验证服务器证书。我需要知道我拥有正确的服务器并且没有中间人充当服务器。 有人可以帮帮我吗?

谢谢!

【问题讨论】:

  • 可以采取的好步骤,但对于检查中间人攻击没有用处。谷歌“Diginotar”,看看为什么整个 SSL CA 系统从根本上被破坏了。
  • @Marc B:在任何基本意义上都没有异议,我想指出,如果您注意使受信任的 CA 列表尽可能短,您可以在实践中避免许多问题.例如,在这种情况下,除了您要连接的站点使用的特定 CA 之外,实际上没有必要信任任何 CA。

标签: php web-services ssl https


【解决方案1】:

如果您有 curl 扩展,可以将其配置为在连接时验证证书。

http://php.net/manual/en/function.curl-setopt.php

// As of writing this, Twitter uses Verisign, Google uses Eqifax
$exampleUrl = 'https://twitter.com/'; // Success
$exampleUrl = 'https://google.com/';  // Fails

// create a new CURL resource
$ch = curl_init($exampleUrl);

// enable verification
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

// list of CAs to trust
// If the remote site has a specific CA, they usually have a .crt
// file on their site you can download.  Or you can export key items from
// some browsers.
// In this example, using: Verisign [1]
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/ca_bundle.crt');
// - or -
curl_setopt($ch, CURLOPT_CAPATH, __DIR__ . '/ca_certs/');

// If the remote site uses basic auth:
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);

// And a helpful option to enable while debugging
//curl_setopt($ch, CURLOPT_VERBOSE, true);

// defaults to stdout, don't want that for this case.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$page = curl_exec($ch);

[1]http://www.verisign.com/support/verisign-intermediate-ca/extended-validation/apache/

【讨论】:

  • 谢谢!对不起这个愚蠢的问题。但我看不到如何测试 Url 或用作 Web 服务客户端。我对php真的很陌生。 :)
  • 如果服务器没有提供由 ca_bundle.crt 中的一个 CA 签名的有效证书,则连接将失败
  • 感谢您的帮助!但是,第一次和第二次调用仍然没有发出任何警告。当我执行 'var_dump($page)' 时,我得到布尔值 false。请帮助... :) 之后我该如何调用服务器功能? (例如,像肥皂客户端?)
  • 请注意上述代码中的一个错误:CURLOPT_SSL_VERIFYHOST 应该是一个整数参数,并且应该设置为 2(默认值)。有关详细信息,请参阅php.net/manual/en/function.curl-setopt.php。如果您将值设置为true,您实际上是在禁用主机检查,从而启用 MITM 攻击!
  • @LeighSimpson 谢谢。编辑答案以纠正它。
【解决方案2】:

从 Curl 7.10 开始,这一切现在都设置为默认检查:
http://php.net/manual/en/function.curl-setopt.php


CURLOPT_SSL_VERIFYPEER

FALSE 阻止 cURL 验证对等方的证书。可以使用 CURLOPT_CAINFO 选项指定要验证的备用证书,也可以使用 CURLOPT_CAPATH 选项指定证书目录。

从 cURL 7.10 开始默认为 TRUE。自 cURL 7.10 起安装的默认包。


CURLOPT_SSL_VERIFYHOST

1 检查 SSL 对等证书中是否存在通用名称。 2 检查公用名是否存在,并验证它是否与提供的主机名匹配。在生产环境中,此选项的值应保持为 2(默认值)。

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多