类似的问题以前已经回答过了,但我还没能解决这个特殊的问题。
在PHP机器上,当我试图在一个特定的域上使用5.6+时,我收到以下信息(不是真正的域):
$ 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证书的方式。
可以建立其他连接而不会出现问题:
$ php -r "var_dump(fsockopen(\"ssl://www.google.com\", 443, \$errnum, \$errstr, 5));"
resource(4) of type (stream)根据其他建议,我检查了默认的cert文件
$ 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包并将其重命名以匹配。还是不走运。
我没有收到任何额外的信息,表明验证证书失败。有没有其他方法来调试这个问题?
发布于 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支持:
$context = stream_context_create(['ssl' => [
'ciphers' => 'RC4-MD5'
]]);
$socket = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);https://stackoverflow.com/questions/40534135
复制相似问题