PHP疑似忽略默认OpenSSL配置,实际使用的配置路径是什么?
PHP OpenSSL 配置文件定位与生效方案
问题本质
PHP的OpenSSL扩展默认不会自动读取系统的/etc/ssl/openssl.cnf——shell环境的openssl命令会默认加载该配置,但PHP的openssl扩展是独立调用OpenSSL库,编译时若未指定配置路径,就不会加载任何配置文件,所以你修改系统配置后,PHP的openssl*方法不受影响。
确认PHP实际配置的步骤
查看编译参数
在容器内执行命令:php -i | grep -i openssl查找
Configure行,若没有--with-openssl-conf选项,说明PHP编译时未指定配置文件路径,此时openssl扩展默认不加载任何配置。让PHP加载指定配置的方法
有两种方式可以让PHP的openssl方法读取目标配置文件:- 修改php.ini:添加或配置
openssl.cnf项,示例:
Alpine的php81-apache2包默认没有这个配置项,需要手动添加,之后重启Apache生效。openssl.cnf = "/etc/ssl/openssl.cnf" - 运行时加载:在PHP脚本开头调用函数加载配置:
调用后后续的openssl*方法会使用该配置。openssl_config('/etc/ssl/openssl.cnf');
- 修改php.ini:添加或配置
验证配置生效
在/etc/ssl/openssl.cnf中加入无效配置(比如在任意节添加invalid_key = test),重启Apache后执行调用openssl方法的PHP脚本,此时应该会抛出与shell环境相同的错误,证明配置已生效。
Alpine Linux 环境特殊说明
Alpine官方的php81-apache2包默认编译时未启用--with-openssl-conf参数,所以PHP的openssl扩展默认不加载系统配置文件,必须手动配置才能让指定的openssl.cnf生效。
内容的提问来源于stack exchange,提问作者Markus Müller
相关产品推荐
相关产品推荐

