php gmssl,centos7 php7 gmssl编译安装
背景:
linux已通過源碼安裝openssl(假設(shè)安裝目錄為:/usr/local/openssl),目前php安裝時所指定的openssl未能支持國密算法,若希望php也能實現(xiàn)國密算法,則編譯安裝php時,需指定gmssl(而非openssl)。
安裝GmSSL:
1、下載源代碼(GmSSL-master.zip),解壓縮至當(dāng)前工作目錄
# unzip GmSSL-master.zip
2、編譯與安裝
# ./config --prefix=/usr/local/gmssl --openssldir=/usr/local/gmssl/ssl
# make
# make test
# make install
若在安裝過程中出現(xiàn):pod2man: command not found 錯誤信息,請使用whereis pod2man命令查看是否安裝了pod2man,否則執(zhí)行yum-yinstall perl-podlators進(jìn)行安裝(建議重裝,即先執(zhí)行yum remove perl-podlators)。
3、安裝之后可以執(zhí)行g(shù)mssl命令行工具檢查是否成功
# /usr/local/gmssl/bin/gmssl version
GmSSL 2.0 - OpenSSL 1.1.0d
執(zhí)行g(shù)mssl命令后,出現(xiàn):/usr/local/gmssl/bin/gmssl: relocation error: /usr/local/gmssl/bin/gmssl: symbol PBEPARAM_it, version OPENSSL_1_1_0d not defined in file libcrypto.so.1.1 with link time reference 錯誤!
暫時解決方法如下:
(1)查看gmssl依賴庫路徑:ldd /usr/local/gmssl/bin/gmssl
libssl.so.1.1 => /usr/local/openssl/lib/libssl.so.1.1 (0x00007fc91a5d0000)
libcrypto.so.1.1 => /usr/local/openssl/lib/libcrypto.so.1.1 (0x00007fc91a0ed000)
(2)把make后的兩個依賴庫拷貝到相應(yīng)路徑(覆蓋原依賴文件,即安裝openssl時所生成的libssl.so.1.1 及l(fā)ibcrypto.so.1.1 文件,注意:這種方法會影響到用openssl的應(yīng)用,以下操作請三思而后行!)
cd /usr/local/src/GmSSL-master
cp libcrypto.so.1.1 /usr/local/openssl/lib/
cp libssl.so.1.1 /usr/local/openssl/lib/
GmSSL與PHP綁定:
GmSSL的PHP擴(kuò)展代碼位于源代碼中的的php/ext/openssl目錄,PHP擴(kuò)展需要和PHP源代碼目錄樹一起編譯,過程如下:
1、下載并編譯安裝GmSSL(上一步已完成);
2、下載最新的PHP源代碼并解壓;
3、用GmSSL的php/ext/openssl目錄替代PHP源代碼中的ext/openssl目錄;
4、編譯和安裝PHP(centos7 php7.3安裝);
!!!請注意!!!
PHP的默認(rèn)配置不編譯OpenSSL擴(kuò)展,需要顯式指--with-openssl才會編譯OpenSSL擴(kuò)展,而且,我們此處需要顯示指定gmssl,因此,在安裝php過程中,執(zhí)行configure操作時,需這樣指定:./configure --with-openssl=/usr/local/gmssl --with-libdir=lib。
在執(zhí)行./configure命令時,若提示:"configure: error: Cannot find OpenSSL's libraries",請執(zhí)行:"ln -s /usr/local/openssl/lib/libssl.so /usr/lib",即使用openssl的libssl而非gmssl的libssl(為的是安裝gmssl時,將對openssl的影響程度降到最低)。
在編譯php過程中(執(zhí)行make 或 make ZEND_EXTRA_LIBS='-liconv'命令),若出現(xiàn):"make: *** [ext/openssl/xp_ssl.lo] Error 1"錯誤信息,可嘗試安裝php7.1(親測php7.1.11安裝成功)而非php7.3。
php安裝成功后,可以通過ldd檢查可執(zhí)行程序是否鏈接了預(yù)期的庫:ldd /usr/local/php73/bin/php。
5、修改PHP配置文件php.ini啟用openssl擴(kuò)展,即取消php.ini中extension=openssl前面的注釋。
可以通過PHP的phpinfo()函數(shù)確認(rèn)openssl擴(kuò)展已經(jīng)啟用,通過ldd命令檢查PHP的二進(jìn)制程序調(diào)用了GmSSL的動態(tài)庫而不是系統(tǒng)默認(rèn)的OpenSSL動態(tài)庫。
國密算法測試:
OPENSSL_KEYTYPE_EC, "curve_name" => "sm2p256v1"));
openssl_pkey_export($prikey, $prikeypem);
echo $prikeypem;
$pubkeypem = openssl_pkey_get_details($prikey)["key"];
echo $pubkeypem;
$pubkey = openssl_pkey_get_public($pubkeypem);
$point = openssl_pkey_get_details($pubkey)["ec"];
printf("SM2 Public Key: (%s, %s)\n", bin2hex($point["x"]), bin2hex($point["y"]));
$ec = openssl_pkey_get_details($prikey)["ec"];
printf("SM2 Private Key: %s\n", bin2hex($ec["d"]));
openssl_sign($msg, $signature, $prikey, "sm3");
$ok = openssl_verify($msg, $signature, $pubkey, OPENSSL_ALGO_SM3);
printf("sm2sign(\"%s\") = %s\n", $msg, bin2hex($signature));
printf("sm2verify(\"%s\", %s) = %s\n", $msg, bin2hex($signature), $ok ? "OK" : "Failure");
openssl_seal($plaintext, $sealed, $ekeys, array($pubkey), "sms4", $iv);
openssl_open($sealed, $opened, $ekeys[0], $prikey, "sms4", $iv);
printf("sm2seal(\"%s\") = %s\n", $plaintext, bin2hex($sealed));
printf("sm2open(%s) = \"%s\"\n", bin2hex($sealed), $opened);
?>
如上述代碼正常執(zhí)行,則說明php已支持gmssl。
參考文獻(xiàn):The GmSSL Project
總結(jié)
以上是生活随笔為你收集整理的php gmssl,centos7 php7 gmssl编译安装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变长参数
- 下一篇: spark中dataframe解析_Sp