【问题标题】:cURL timeout when calling HTTPS page with old certs使用旧证书调用 HTTPS 页面时 cURL 超时
【发布时间】:2011-09-27 20:22:25
【问题描述】:

我正在尝试使用 PHP 和 cURL (libcurl) 从我所在机构的数据服务中获取 XML。正在我的本地机器上进行开发。它是在 PHP 中作为 Drupal 和 Transformations 模块的一部分进行评估的代码。

它具有 SSL 支持,如运行所示:

$curl-config --features (来自libcurl docs

SSL
IPv6

NTLM

正在执行的 PHP 代码:

/**
 * Get a web file (HTML, XHTML, XML, image, etc.) from a URL.  Return an
 * array containing the HTTP server response header fields and content.
 * FROM: http://bit.ly/lNIlOu
 */
function get_web_page( $url )
{
  $agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30';
  //$agent = 'spider';

  $options = array(
    CURLOPT_RETURNTRANSFER => true,     // return web page if successful
    CURLOPT_HEADER         => false,    // don't return headers
    CURLOPT_FOLLOWLOCATION => true,     // follow redirects
    CURLOPT_ENCODING       => "",       // handle all encodings
    CURLOPT_USERAGENT      => $agent, // who am i
    CURLOPT_AUTOREFERER    => true,     // set referer on redirect
    CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
    CURLOPT_TIMEOUT        => 120,      // timeout on response
    CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    CURLOPT_SSL_VERIFYPEER => false,    // Disabled SSL Cert checks
    CURLOPT_SSL_VERIFYHOST => false,    // Disable host checks ?
  );

  $ch      = curl_init( $url );
  curl_setopt_array( $ch, $options );
  $content = curl_exec( $ch );
  $err     = curl_errno( $ch );
  $errmsg  = curl_error( $ch );
  $header  = curl_getinfo( $ch );
  curl_close( $ch );

  $header['errno']   = $err;
  $header['errmsg']  = $errmsg;
  $header['content'] = $content;
  return $header;
}

$url = 'https://ws.admin.washington.edu/student/v4/public/section.xml?year=2011&quarter=autumn&curriculum_abbreviation=BIOL&course_number=&id=&search_by=Instructor';
$result = get_web_page($url);

echo '<pre>CURL result:<br/>';
var_dump($result);
echo '</pre>';

转储 $ch 的精简版:

array(24) {
  ["url"]=>
  string(155) "https://ws.admin.washington.edu/student/v4/public/section.xml?year=2011&quarter=autumn&curriculum_abbreviation=BIOL&course_number=&id=&search_by=Instructor"
  ["content_type"]=>
  NULL
  ["http_code"]=>
  int(0)
  ["header_size"]=>
  int(0)
  ["request_size"]=>
  int(237)
  ...
  ["ssl_verify_result"]=>
  int(20)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(120.41427)
  ...
  ["connect_time"]=>
  float(0.11626)
  ...
  ["certinfo"]=>
  array(0) {
  }
  ["errno"]=>
  int(28)
  ["errmsg"]=>
  string(67) "Operation timed out after 120000 milliseconds with 0 bytes received"
  ["content"]=>
  bool(false)
}

当我自己访问该网站时,它只会加载。我什至将代理签名设置为与我自己的完全相同。

任何帮助将不胜感激。

【问题讨论】:

  • 这很奇怪,它不适合你。我复制了上面的代码并通过命令行(在 Mac 上)运行它,它就像一个魅力。尝试添加 curl_setopt($ch, CURLOPT_VERBOSE, 1); 并查看附加信息是否有任何帮助。
  • 感谢您试用。我将其用作 Drupal 中模块的一部分,这可能是原因,模块或 drupal 中的某些内容可能更改了 cURL 设置,但由于我正在创建自己的实例,所以我不明白。也会将此添加到我的帖子中,并尝试添加您给我的内容。
  • 实际上只是简单地在 Drupal 外部运行它会出现同样的问题。现在我不知道了。
  • 您是否尝试过添加上面的详细设置?
  • 也可以在我的终端上使用。不过必须添加--insecure 选项。

标签: php drupal curl https libcurl


【解决方案1】:

对我来说,添加curl_setopt($ch, CURLOPT_SSLVERSION, 3); 神奇地解决了这个问题!

【讨论】:

  • 这是妈妈很常见的问题。默认 SSL 版本设置为 2,但在 openssl 模块中不受支持。我遇到了同样的问题并搜索了很多以找到解决方案。
【解决方案2】:

当我将它上传到我的服务器时,它现在可以工作了。我在我的 Mac OSX 10.6.7 上尝试了这个,它似乎阻止了 HTTPS 协议常用的端口 443。我找不到打开它的方法或找出它被阻止的原因。

但我的脚本在我的本地机器之外运行良好

感谢您到目前为止的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多