2016-11-10 36 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);