2016-11-10 39 views
2

以前已回答过类似问题,但我无法解决此特定情况。fockopen:无法启用加密

在一个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最初失踪,我下载CA束从卷曲并重新命名为匹配。仍然没有运气。

我没有收到任何附加信息,指出验证证书失败。有没有其他的方法来调试这个问题?

+0

嗯。如果只发生在一个域上,并且您不会告诉我们域名是什么,这对于帮助您来说将会非常棘手。 – Chris

+0

您可以检查您尝试连接的网站是仅SSLv3还是支持TLS? – Chris

+0

@Chris你没错。该域名是ts1.fcnsrv.net – user3545769

回答

2

经过多次抨击后,我终于找到原因。

PHP 5.6支持实现加密,可以除去老年人更容易受到那些支持的默认设置。 http://php.net/manual/en/migration56.openssl.php

PHP使用的默认密码已根据»Mozilla密码建议更新为更安全的列表,还有两个额外排除项:匿名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);