PHPCrawl无法创建SSL套接字


PHPCrawl fails to create SSL socket

我正在尝试使用PHPDrawl(http://sourceforge.net/projects/phpcrawl/)搜索通过HTTPS交付的网站。

我可以在PHPDrawlerHTTPRequest类(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,但这个->套接字仍然是false。

该方法的文件说明如下:

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

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

因此,我尝试使用注释部分提供的一个示例来修改流上下文,使用"stream_context_set_option"将verify_host和verify_peer设置为false,这两种设置似乎都没有任何效果。

我不太精通PHP或复杂的网络——有人知道吗:

  • 什么情况(特别是)会导致此调用失败?或
  • 这个问题的解决方法

我需要注意的是,我正在使用Facebook(HTTPS)作为测试服务器。

我发现了问题-

  • PHP版本5.6.x默认开启对等验证,显然有时找不到必要的证书(请参阅此错误报告)

  • 解决方法是返回到5.6 之前的PHP版本

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

您要做的是将PHPDrawlerHTTPReqeust.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,
    )
));

希望这对将来的人有所帮助。