PHP7.4更新openssl扩展

一个PHP项目更新需要用的SM3/SM4算法. 在本地开发测试的时候直接用openssl扩展的相关函数来做的挺方便. 到服务器后发现并不支持这个算法.
服务器环境为centos7, yum仓库自带的openssl扩展为1.0.2k, 编译安装的PHP7.4.33. 需要升级openssl扩展才能支持这个算法.一开始直接用openssl3的版本, 发现和PHP7不兼容,编译不通过.
考虑了两个方案: 一种时升级到php8.3, 经过测试可以兼容, 编译通过. 第二种方案是升级到openssl1.1.1w, 可以兼容PHP7.
再次记录下升级openssl扩展经过.

  • 下载和编译openssl1.1.1w. 个人喜欢把东西都装在/usr/local/目录下
cd /usr/local/src/
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1w.tar.gz
tar -xf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config -fPIC shared --prefix=/usr/local/openssl1.1.1w
make
make install
cp /usr/local/openssl1.1.1w/lib/*.so.1.1 /usr/lib64/
  • 本来以为configure的时候用--with-openssl=dir来指定需要用到的openssl版本就可以. 结果一直没成功, 看php官网文档才发现7.4.0以后这个指令会忽略掉dir, 只能通过PKG_CONFIG_PATH 或者设置OPENSSL_LIBS 和 OPENSSL_CFLAGS 变量来指向位置. 不太想设置这些, 就直接把相关.pc配置替换了.
    备份低版本openssl的pkg-config配置文件. 不然编译PHP的时候还是会使用旧版的openssl. 再将1.1.1w版本的.pc配置文件复制过去. 关于pkg-config相关的东西后面再说.
mv /usr/lib64/pkgconfig/openssl.pc /usr/lib64/pkgconfig/openssl.pc.bk
mv /usr/lib64/pkgconfig/libssl.pc /usr/lib64/pkgconfig/libssl.pc.bk
mv /usr/lib64/pkgconfig/libcrypto.pc /usr/lib64/pkgconfig/libcrypto.pc.bk
cp /usr/local/openssl1.1.1w/lib/pkgconfig/*.pc  /usr/lib64/pkgconfig/
  • 重新编译PHP7.4.33.
cd /usr/local/src/php
php -i | grep config  #查看之前的编译选项
./configure  --prefix=/usr/local/php74 --with-pdo-pgsql --with-zlib-dir --enable-mbstring --enable-soap --enable-calendar --with-curl --enable-gd --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --with-zip --with-pcre-jit --with-pdo-mysql --with-mysqli --with-openssl=/usr/local/openssl --with-fpm-user=www --with-fpm-group=www --enable-ftp --with-gettext --with-xmlrpc --with-xsl --enable-opcache --enable-fpm --with-iconv --with-pear

make -j 7
systemctl stop php-fpm  # 之前做了fpm的服务, 先停止下
make install
systemctl start php-fpm 
  • 然后测试系统是不是还正常. 看下扩展更新没
/usr/local/php74/bin/php -r "phpinfo();" | grep OpenSSL  #看到1.1.1w版本就行了
/usr/local/php74/bin/php -i | grep OpenSSL # 这个也行
  • 再说说pkg-config. 比如你的程序需要依赖openssl, 原本手动编译的时候需要指定头文件, 库文件等, 就像这样"-I/usr/local/openssl/include -L/usr/local/openssl/lib64 -lssl -lcrypto", 写起来很麻烦. 而用pkg-confg openssl --libs --cflags 直接就能把需要的依赖文件展示出来了, 省时省力.
    那pkg-config怎么知道具体哪个程序需要哪些依赖呢? 它就从两个地方来对应的 .pc配置.
    一是 /usr/lib64/pkgconfig/ 下面, 一个是PKG_CONFIG_PATH 环境变量设定的目录下面.
    比如上面编译PHP时备份的三个.pc文件: openssl.pc, libssl.pc libcrypto.pc 里面原本设定的是使用1.0.2版本的openssl, 但是我希望编译的时候能使用1.1.1版本的, 就必须替换这里相应的.pc文件.
    如果说/usr/lib64/pkgconfig/下面有对应.pc文件设置, 然后PKG_CONFIG_PATH变量设置的目录下也有对应的.pc文件设置, 那到底会用哪个呢? 嗯...那个我不会去干这种让自己迷糊的事情, 所以也没有去测试过. 我猜可能是以lib64目录下的为主吧.

  • ldconfig ldd 如果报错说找不到动态依赖库, 可以用ldd 来看看对应程序的依赖是否缺失. 然后各种.so都复制到/lib64/下面就好.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容