我在我的网站上运行一个连接到Facebook的脚本,它运行正常,直到我的服务器用buggy version of Openssl更新了Centos。 我的问题是,在Redhat发布新版本之前,我已经遇到了这个错误。
这是我的脚本实际运行方式:
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或类似的东西。我该如何解决这个问题?
答案 0 :(得分:1)
这不是一个解决方案,它只是在我的盒子上运行类似的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" . "\r\n";
$request_headers .= "Host: www.google.com" . "\r\n";
$request_headers .= "Connection: close" . "\r\n";
$request_headers .= "\r\n";
// 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错误。