Ubuntu22.04编译PHP8.0.15开启openssl支持时make报错
问题描述
从源码构建PHP 8.0.15版本,执行配置命令./configure --with-openssl完成后,运行make执行编译阶段出现如下末尾报错:
^~~~~~~~~~~~~~~~~~~~~~~ In file included from /home/ubuntu/build/php-8.0.15/ext/openssl/openssl.c:46: /usr/include/openssl/rsa.h:289:29: note: expected ‘RSA *’ {aka ‘struct rsa_st *’} but argument is of type ‘const struct rsa_st *’ 289 | RSA *rsa, int padding); | ~~~~~^~~ make: *** [Makefile:638: ext/openssl/openssl.lo] Error 1
当前环境信息:
- 操作系统:Ubuntu 22.04 LTS
- OpenSSL版本:OpenSSL 3.0.2 15 Mar 2022(系统链接库版本一致)
根因
PHP 8.0.15发布时未做OpenSSL 3.0的API适配。OpenSSL 3.0调整了RSA相关操作函数的参数签名,对入参的const修饰符校验更严格,PHP自带openssl扩展传参类型和系统安装的OpenSSL 3.0头文件定义不匹配,直接触发编译失败。
解决方法
三选一即可,优先选前两种稳定性更高的方案:
- 升级PHP源码版本:直接更换为PHP 8.0.18及以上的8.0分支版本源码,官方从8.0.18版本开始合入了OpenSSL 3.0全量兼容补丁,下载新版本源码后重新执行配置、编译流程即可,不需要额外修改代码。
- 手动修改源码适配:不想换源码版本的话按以下步骤操作:
- 进入PHP源码根目录,打开
ext/openssl/openssl.c文件,检索所有RSA_public_encrypt、RSA_private_decrypt函数调用位置,将传入的RSA类型参数强制转换为非const类型,即把传参rsa替换为(RSA *)rsa - 保存文件后执行
make clean,清理之前编译生成的中间目标文件 - 重新执行
./configure --with-openssl、make即可正常完成编译
- 进入PHP源码根目录,打开
- 降级编译依赖的OpenSSL版本:自行编译安装OpenSSL 1.1.1版本到独立非系统目录(例如
/usr/local/openssl11),避免覆盖系统自带的OpenSSL 3.0,配置PHP时指定依赖的OpenSSL路径:./configure --with-openssl=/usr/local/openssl11,后续正常执行编译即可。
注意:手动修改源码如果漏改其他不匹配的参数位置,后续运行OpenSSL相关功能时可能出现隐式兼容问题,生产环境不推荐用这种方式。
内容的提问来源于stack exchange,提问作者Black
相关产品推荐
相关产品推荐

