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类库实现该方法。
- 使用了OneSm 类库,看特性介绍速度蛮快,所以安装使用了。但不知为何得到的结果总是错的,无奈放弃。
- 使用了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已经成功升级。
通过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
可以看到成功出结果了,速度也很快。