stream_socket_enable_crypto替代方案或类似解决方案



我正在我的网站上运行一个连接到Facebook的脚本,它一直运行良好,直到我的服务器用有缺陷的Openssl版本更新了Centos。我的问题是,在Redhat发布新版本之前,我一直被这个bug所困扰。

这是我的脚本如何实际运行:

  if( !stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT))
  {
    throw new Exception('stream_socket_enable_crypto failed');
  }

显然,现在它一直失败,并出现以下错误:

PHP Warning:  stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:100AE081:elliptic curve routines:EC_GROUP_new_by_curve_name:unknown group
error:1408D010:SSL routines:SSL3_GET_KEY_EXCHANGE:EC lib

因此,还有任何其他选择可以在资源上启用加密,如curl或类似的东西。我该怎么解决这个问题?

这不是一个解决方案,它只是在我的盒子上运行的一个类似的OpenSSL测试。

我今天更新了我的CentOS盒子,所以我有了它的最后一个版本:


# cat /etc/redhat-release
CentOS release 6.5 (Final)

OpenSSL版本为:


openssl.i686 0:1.0.1e-16.el6_5
openssl-devel.i686 0:1.0.1e-16.el6_5

我对它进行了以下测试:


<?php
  // open the socket
  $f = @stream_socket_client("google.com" . ":" . "443", $err, $errstr, 30);
  if (!$f) {
    echo "Socket error: (" . $err . ") " . $errstr . "n";
    exit;
  }
  // Start SSL, if needed
  if(!@stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
    echo "Socket error. Can not start SSL encryption" . "n";
    exit;
  }
  $request_headers  = "GET / HTTP/1.1" . "rn";
  $request_headers .= "Host: www.google.com" . "rn";
  $request_headers .= "Connection: close" . "rn";
  $request_headers .= "rn";
  // send the HTTP headers
  fputs ($f, $request_headers);
  // read everything
  $buf = "";
  while(!feof($f)) {
    $buf .= fgets ($f, 8192);
  }
  // close the socket
  fclose($f);
  echo $buf;
  echo "n";
?>

最后,我得到了所需的响应,没有出现Open SSL错误。

在我的案例中,它取代了

STREAM_CRYPTO_METHOD_TLS_CLIENT

带有:

STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT

这是因为TLS1.0(相当于STREAM_CRYPTO_METHOD_TLS_CLIENT)正在被弃用。

最新更新