PHPCrawl无法创建SSL套接字

时间:2015-04-02 00:39:01

标签: php sockets ssl https web-crawler

我正在尝试使用PHPCrawl(http://sourceforge.net/projects/phpcrawl/)来搜索通过HTTPS提供的网站。

我可以看到PHPCrawlerHTTPRequest类(openSocket方法)中支持SSL:

// If ssl -> perform Server name indication
  if ($this->url_parts["protocol"] == "https://")
  {
    $context = stream_context_create(array('ssl' => array('SNI_server_name' => $this->url_parts["host"])));
    $this->socket = @stream_socket_client($protocol_prefix.$ip_address.":".$this->url_parts["port"], $error_code, $error_str,
                                          $this->socketConnectTimeout, STREAM_CLIENT_CONNECT, $context);
  }

问题在于对stream_socket_client的调用 - 虽然它返回零error_code,而没有error_str,但是这个> socket仍然是假的。

该方法的文档说明如下:

  

如果errno中返回的值为0且函数返回FALSE,则表示错误发生在connect()调用之前。

(见http://php.net/manual/en/function.stream-socket-client.php

所以我尝试使用评论部分提供的示例来修改流上下文,使用'stream_context_set_option'将verify_host和verify_peer设置为false - 两者似乎都没有任何效果。

我不是非常精通PHP或网络错综复杂 - 有没有人知道:

  • 什么条件(具体)会导致此调用失败? OR
  • 该问题的解决方法?

我应该注意 - 我使用Facebook(HTTPS)作为测试服务器。

2 个答案:

答案 0 :(得分:2)

我发现了这个问题 -

  • PHP版本5.6.x默认启用对等验证,显然有时找不到necesarry证书(see this bug report

  • 解决方法是回退到5.6

  • 之前的PHP版本

答案 1 :(得分:0)

旧主题,但是使用PHPCrawler遇到相同的问题。对我有用的是用户在sourceforge上写的内容(来源:https://sourceforge.net/p/phpcrawl/bugs/86/#5993)。

您要做的是将PHPCrawlerHTTPReqeust.class.php中第547行的stream_context_create重写为以下内容:

$context = stream_context_create(array(
    'ssl' => array(
        'SNI_server_name' => $this->url_parts["host"],
        'verify_peer' => false,
        'verify_peer_name' => false,
    )
));

希望这对以后的人有帮助。