【问题标题】:fockopen: Failed to enable cryptofockopen:无法启用加密
【发布时间】:2016-11-10 17:58:02
【问题描述】:

以前已经回答过类似的问题,但我无法解决这个特殊情况。

在 PHP 5.6+ 机器上,当我尝试在特定域上使用 fsockopen 时,我收到以下信息(不是真实域):

$ 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)

这在 PHP 5.5 上运行良好,这表明它是由于 5.6 中处理 fsockopen 验证 ssl 证书方式的变化。

可以毫无问题地进行其他连接:

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

根据其他建议,我检查了默认证书文件

$ 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 包并将其重命名以匹配。还是没有运气。

我没有收到任何其他信息表明验证证书失败。还有其他方法可以调试问题吗?

【问题讨论】:

  • 嗯。如果它只发生在一个域上并且您不会告诉我们该域是什么,那么这将很难帮助您。
  • 您能否检查您尝试连接的站点是仅 SSLv3 还是支持 TLS?
  • @Chris 你说得对。域名是 ts1.fcnsrv.net

标签: php ssl curl


【解决方案1】:

打了这么多头,我终于找到了原因。

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

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

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

$context = stream_context_create(['ssl' => [
  'ciphers' => 'RC4-MD5'
]]);

$socket = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2022-08-09
    • 2019-08-10
    相关资源
    最近更新 更多