首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fockopen:启用加密失败

问fockopen:启用加密失败
EN

Stack Overflow用户
提问于 2016-11-11 01:58:02
回答 1查看 12.5K关注 0票数 3

类似的问题以前已经回答过了,但我还没能解决这个特殊的问题。

在PHP机器上,当我试图在一个特定的域上使用5.6+时,我收到以下信息(不是真正的域):

代码语言:javascript
复制
$ php -r "var_dump(fsockopen(\"ssl://www.domain.net\", 9085, \$errnum, \$errstr, 5));"
PHP Warning:  fsockopen(): Failed to enable crypto in Command line code on line 1
PHP Warning:  fsockopen(): unable to connect to ssl://www.domain.net:9085 (Unknown error) in Command line code on line 1
bool(false)

这在PHP5.5上工作得很好,这是因为5.6中的更改处理了fsockopen验证ssl证书的方式。

可以建立其他连接而不会出现问题:

代码语言:javascript
复制
$ php -r "var_dump(fsockopen(\"ssl://www.google.com\", 443, \$errnum, \$errstr, 5));"
resource(4) of type (stream)

根据其他建议,我检查了默认的cert文件

代码语言:javascript
复制
$ php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /usr/lib/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/lib/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/lib/ssl/private
    [default_default_cert_area] => /usr/lib/ssl
    [ini_cafile] =>
    [ini_capath] =>
)

文件/usr/lib/ssl/cert.pem最初丢失,我从curl下载ca包并将其重命名以匹配。还是不走运。

我没有收到任何额外的信息,表明验证证书失败。有没有其他方法来调试这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-05 02:28:34

经过多次的猛烈抨击,我终于找到了原因。

PHP5.6实现了一组默认的支持密码,这移除了对旧的更易受攻击的密码的支持。http://php.net/manual/en/migration56.openssl.php

PHP使用的默认密码已经根据»Mozilla cipher建议更新为更安全的列表,并增加了两个排除项:匿名Diffie-Hellman密码和RC4。我尝试连接的域目前支持TLSv1/SSLv3,密码RC4-MD5

解决我切换到stream_socket_client而不是fsockopen的问题。在上下文中增加对流密码的RC4-MD5支持:

代码语言:javascript
复制
$context = stream_context_create(['ssl' => [
  'ciphers' => 'RC4-MD5'
]]);

$socket = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40534135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档