PHP7与OpenSSL编译安装-使用openssl函数进行高效国密算法3(SM3)计算

  • 背景
  • 尝试1-使用PHP类库实现
  • 尝试2-使用PHP的OpenSSL扩展实现
  • Step1.编译安装openssl
  • Step2.编译安装php
  • Step3.配置Web服务
  • Step4.验证配置
  • 通过PHP调用测试


背景

最近要调用一个短信接口,签名计算部分使用的国密3摘要计算算法(sm3),其实这东西实现的效果跟md5和sha都差不多,不过php没有原生支持该算法的函数,所以需要借助外力了。

尝试1-使用PHP类库实现

利用composer安装第三方php类库实现该方法。

  1. 使用了OneSm 类库,看特性介绍速度蛮快,所以安装使用了。但不知为何得到的结果总是错的,无奈放弃。
  2. 使用了SM3-PHP类库,测试后可以使用,但由于计算签名的字符串较长,PHP执行效率等多个原因,使用该方法速度较慢,无奈只能作为备选方案。

尝试2-使用PHP的OpenSSL扩展实现

openssl在1.1.1版本中支持了国密算法,这让我想起了php的openssl扩展,于是就开始尝试使用openssl进行sm3计算。
由于我的系统版本是ubuntu 16.04,内置的openssl是1.0.2k,版本比较老,所以需要升级。同时升级openssl也牵扯到对php中openssl扩展的升级。于是异常艰难的踩坑之路就开始了。。。

Step1.编译安装openssl

去openssl官网下载了最新版本源码1.1.1k后,开始编译安装,由于是在树莓派上,速度较慢,经历了漫长的编译后,终于装上了。。。
openssl编译安装命令

./config shared zlib && make && make install

以下为本人使用源码手动编译安装,实际上卸载PHP与web服务器后,使用onestack可以快速进行一键安装从而跳过下列步骤

Step2.编译安装php

由于系统自带的php是使用apt安装的,且openssl类库并不是扩展挂载上去的,所以要想升级必须要删除当前PHP后重新安装。于是又去官网下载了同版本的PHP源码,卸载当前的PHP,重新编译安装。

编译安装之前需要安装一些依赖库:

apt-get install -y autoconf libtool re2c libxml2-dev openssl libcurl4-openssl-dev  libbz2-dev libjpeg-dev \ 
libpng12-dev libfreetype6-dev libldap2-dev libmysqlclient-dev libxslt1-dev libxt-dev libpcre3-dev libxpm-dev libt1-dev libgmp-dev \
libpspell-dev librecode-dev libreadline6-dev bison libtidy-dev libmcrypt-dev

编译安装

./configure --prefix=/usr/local/php  --able-mbstring --with-curl --disable-debug  --disable-rpath --enable-inline-optimization --with-bz2  --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysqli --with-gd --with-jpeg-dir --with-openssl
# -j参数可以进行多线程同时编译,可以加快编译速度,根据配置酌情调节。
make -j 3
make install

之后由于是编译安装,安装后需要将php-fpm加入到系统服务中才能自启动,参见该链接。

Step3.配置Web服务

由于我是用的是Apache2,在卸载php时,apache对php的支持模块一同卸载了,所以我使用让apache通过php-fpm方式支持php。
在Apache的VirtualHost节点中加入下列两行配置,即可完成配置。

ProxyRequests Off
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/{web的根路径}/$1

Step4.验证配置

配置完成后,重启服务,使用phpinfo函数查看php配置,可以发现openssl已经成功升级。

python 国密openssl openssl支持国密算法_linux

通过PHP调用测试

在PHP中使用openssl_digest方法即可进行摘要计算计算

root@inspire-desktop:~# time php -r "echo openssl_digest("123123123123","sm3");"166f940ef62738dca0876d3570c4ecfe24c9d3437599bed3487015f42f080dd9
real    0m0.136s
user    0m0.110s
sys     0m0.030s
root@inspire-desktop:~# php -r "echo openssl_digest("123123123123","sm3");" 
166f940ef62738dca0876d3570c4ecfe24c9d3437599bed3487015f42f080dd9

可以看到成功出结果了,速度也很快。