背景
随着当前国家安全信息监管的要求越来越严格,众多金融银行类App 都被要求必须使用国密算法加密通信。mPaaS 对国密算法加密客户端、网关都是支持的,这里整理一份从生成到配置完成的完整指南,以供参考。
生成SM2密钥
Mac OS下
Mac OSX一般自带的有OpenSSL。但因为OpenSSL“心脏病失血”事件,Mac OSX 自 10.11 El Capitan 起,将原有的 OpenSSL 替换为 LibreSSL 。在以上这些系统中应该除了实测必须要用 OpenSSL 软件外,应该都可以用 LibreSSL 取代 OpenSSL。而对于其他大多数还没有将系统自带的 OpenSSL 替换为 LibreSSL 的会麻烦一些,并且也可能做不到彻底替换。只是对于编译安装的软件,可以尽量用 LibreSSL 取代 OpenSSL。(其他用LibreSSL 取代 OpenSSL的系统还有:OpenBSD 自 5.6 起,Alpine Linux 自 3.5.0 起)。
所以 Mac 下OpenSSL 生成SM2密钥就需要自己安装OpenSSL,网上有方式直接更改替换Mac OS自带的LibreSSL,这里为了不影响Mac 使用者的日常正常使用,不使用这种方式,而是在Mac 上download 一个OpenSSL版本安装、解压后单独使用,完全不会影响原有的LibreSSL。
这里以openssl 1.1.1d实现为例:
- 下载openssl源码
curl -o openssl-1.1.1d.tar.gz https://www.openssl.org/source/openssl-1.1.1d.tar.gz
- 解压源码包
tar -xvf openssl-1.1.1d.tar.gz
- 进入解压的openssl目录
cd openssl-1.1.1d
- 配置生成makefile
./config --prefix=/usr/local/openssl
- 安装
//这里用了sudo 需要输入电脑密码,为了保证不会因为权限不足而安装报错
sudo make install
- 设置openssl lib .so加载配置
//此步骤可以忽略,so加载配置与否不影响使用生成SM2
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v
- 生成SM2密钥
i. 进入生成密钥文件的目录,执行以下命令生成私钥
/usr/local/openssl/bin/openssl ecparam -genkey -name SM2 -out SM2PrivateKey.pem
ii. 进入生成密钥文件的目录,生成公钥
/usr/local/openssl/bin/openssl ec -in SM2PrivateKey.pem -pubout -out SM2PublicKey.pem
Windows 下
同样Windows 下也是需要一些途径才能生成SM2国密密钥。
OpenSSL官网没有提供windows版本的安装包,可以选择其他开源平台提供的工具。
工具地址:http://slproweb.com/products/Win32OpenSSL.html。
- 下载工具
选择32位或者64位合适的版本下载,例如Win64OpenSSL_Light-1_0_2h.exe。
- 安装Win64OpenSSL软件
设置环境变量,自行确定安装位置。
- 打开Win64OpenSSL软件,运行以下命令
ecparam -genkey -name SM2 -out priv.key
ec -in priv.key -pubout -out pub.key
服务端配置
- 打开登录移动开发平台->移动网关->网关管理->数据加密->打开。
- 打开后会弹出选择加密方式和密钥的弹出,选SM2 并 填写对应的私钥密钥。
客户端配置
iOS端
- iOS客户端的加密方式和公钥是配置在info.plist下的,详情见图:
其中,
- mPaaSCrypt:加密配置的主 key,value 是 Dictionary 类型,里面包含了客户端加密所需设置的相关信息。
- Crypt:是否进行加密,value 是 Boolean 类型,YES 代表加密,NO 代表不加密。
- GWWhiteList: 需要进行加密的网关,即当前环境的网关地址。如果没有该 key ,则所有的请求 都不会加密。
- RSA/ECC/SM2:非对称加密算法选择,value 是 String 类型,只能填 RSA 或 ECC 或 SM2。
- PubKey:非对称加密公钥。value 是 String 类型,与选择的非对称加密算法保持一致。
注:iOS端PubKey 的Value 不运行有空格自行换行等,格式不可错误。
Android端
- Android 端的加密方式和公钥是配置在mpaas_netconfig.properties 文件下,如图:其中,
- Crypt:表示是否使用自加密,true 表示使用,false 表示关闭自加密功能。
- RSA/ECC/SM2:表示要使用的非对称加密算法,其值只能填充 RSA 或 ECC 或 SM2。
- PubKey:表示选择的非对称加密算法的公钥。
- GWWhiteList: 需要进行加密的网关,即当前环境的网关地址。如果没有该 key ,则所有的请求 都不会加密。
注:由于 Android 中 properties 文件的 value 值需要在同一行,因此填充公钥时需注意。