You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP 7提示无兼容服务器到客户端加密算法,求错误原因及解决方法

关于PHP 7中「Notice: No compatible server to client encryption algorithms found」的问题解析

错误原因

这个Notice本质是PHP端(客户端)和目标服务端的加密算法集没有交集导致的,常见触发场景包括:

  • 你在使用需要加密通信的扩展(比如LDAP、MySQLi SSL连接、自定义SSL交互)时,两端支持的加密算法完全不重叠
  • PHP的OpenSSL扩展默认启用的算法被服务端的安全策略排除,或者服务端只支持PHP默认未开启的强加密算法
  • PHP 7早期版本的OpenSSL扩展对TLS 1.2+的新算法支持不足,和较新的服务端加密策略不兼容

解决方案

根据不同场景,你可以按以下步骤排查解决:

1. 先确认两端的加密算法支持列表

首先在PHP脚本中执行这段代码,查看当前环境支持的所有加密算法:

print_r(openssl_get_cipher_methods());

然后去目标服务端(比如LDAP服务器、MySQL服务器)的配置文件或管理后台,找到它允许的加密算法列表,对比找出双方都支持的算法。

2. 手动指定兼容的加密算法

如果是LDAP连接场景,可以在建立连接时手动指定兼容算法:

$ldapconn = ldap_connect("ldap.example.com");
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
// 替换成双方都支持的算法集,比如下面的示例
ldap_set_option($ldapconn, LDAP_OPT_X_TLS_CIPHER_SUITE, "AES-256-CBC:HIGH:!MD5:!RC4");
ldap_start_tls($ldapconn);

如果是MySQLi的SSL连接,可以在初始化时指定加密算法:

$mysqli = new mysqli("localhost", "user", "password", "db", 3306, "mysql", MYSQLI_CLIENT_SSL);
// 手动设置服务端支持的cipher
$mysqli->ssl_set(null, null, null, null, "AES256-SHA");

3. 更新PHP的OpenSSL配置或版本

  • 尽量升级到PHP 7.4及以上的分支,旧版本的OpenSSL扩展对新加密算法的支持有限
  • 编辑php.ini文件,修改openssl.cipher_list配置,加入服务端支持的算法,示例:
openssl.cipher_list = AES-256-CBC:HIGH:!aNULL:!MD5:!RC4

修改完成后重启Web服务器(Apache/Nginx)让配置生效。

4. 调整服务端加密策略(若有权限)

如果你能控制服务端的配置,可以适当放宽加密算法限制,加入PHP支持的算法集——比如在LDAP服务器配置中添加兼容算法,或者在MySQL的my.cnf里调整ssl_cipher参数。


内容的提问来源于stack exchange,提问作者Marcelo Mondaca

火山引擎 最新活动