GmSSL的PHP语言绑定

PHP内置了OpenSSL扩展,通过openssl为前缀的函数提供杂凑计算、加密、数字签名、X.509证书和数字信封等功能,基本覆盖了OpenSSL的主要功能。由于GmSSL和OpenSSL具有良好的API兼容性,GmSSL的SM2、SM3、SMS4等算法实现也可以通过PHP的openssl函数访问,因此GmSSL项目无需设计实现独立的PHP接口绑定。

这里简要介绍一下如何在Linux操作系统中编译PHP和GmSSL。

首先下载并编译安装GmSSL-2.0代码,在Linux操作系统中通常默认的编译选项为—prefix=/usr/local—openssldir=/usr/local/ssl。然后从源代码编译PHP。PHP的默认配置不编译OpenSSL扩展,需要显式指定—with-openssl才会编译OpenSSL扩展。可以通过ldd检查安装好的php可执行程序是否链接了预期的库:

ldd /usr/local/bin/php
	linux-vdso.so.1 =>  (0x00007ffd90152000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f30bc909000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f30bc600000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f30bc3fc000)
	libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f30bc042000)
	libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x00007f30bbdd2000)
	libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x00007f30bb944000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f30bb57d000)
	/lib64/ld-linux-x86-64.so.2 (0x000055e66ae8e000)
	libicuuc.so.57 => /usr/lib/x86_64-linux-gnu/libicuuc.so.57 (0x00007f30bb1d5000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f30bafb9000)
	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f30bad93000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f30bab75000)
	libicudata.so.57 => /usr/lib/x86_64-linux-gnu/libicudata.so.57 (0x00007f30b90f6000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f30b8d6e000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f30b8b57000)

可以执行如下的PHP文件进行测试

<?php
echo "Version: ".OPENSSL_VERSION_TEXT."\n";
echo "SM3(\"abc\") = ".openssl_digest("abc", "sm3")."\n";
$key = "aabbccddeeffgghh";
$iv = "1234567890123456";
$ciphertext = openssl_encrypt("abc", "sms4", $key, 0, $iv);
$plaintext = openssl_decrypt($ciphertext, "sms4", $key, 0, $iv);
echo 'SM4("'.$plaintext.'") = '.$ciphertext;
?>

产生如下的输出说明php可执行程序正确链接了GmSSL库并且可以通过OpenSSL扩展调用SM2、SM3、SM4等算法。

Version: GmSSL 2.0 - OpenSSL 1.1.0d  26 Jan 2017
SM3("abc") = 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
SM4("abc") = R0824netn6dbIY7BjETKpA==