1. 申请实名信息返回
登录腾讯云 人脸核身控制台,单击自助接入-E证通服务,在E证通服务列表右侧操作栏中单击申请返回身份信息。
将 CA 证书申请表和 CSR(证书签名请求)文件上传到控制台,确认后单击提交进行申请。
CA 证书申请表参考 模板 进行填写,并上传控制台。
注意
三联申请表及办理人身份证、营业执照复印件需要加盖单位公章。
CSR(证书签名请求)文件制作操作步骤参考如下步骤2。
2. 制作 CSR 文件
2.1 安装国密 SSL
注意
目前该工具安装暂不支持 MAC M1 处理器。
提供两种下载方式:
git 下载,需要先安装 git 工具。
# 拉取源码git clone -b GmSSL-v2 https://github.com/guanzhi/GmSSL.git# 进入目录cd GmSSL
链接下载。
# 下载源码包wget https://github.com/guanzhi/GmSSL/archive/refs/heads/GmSSL-v2.zip# 解压文件unzip GmSSL-v2.zip# 进入目录cd GmSSL-GmSSL-v2
下载方式任选一种,成功执行后,已经进入相应文件夹内,然后执行下方操作:
# 如果 MAC 机器,执行,Linux 环境机器跳过该步骤直接编译即可sed -i '' 's%qw/glob%qw/:glob%g' Configuresed -i '' 's%qw/glob%qw/:glob%g' test/build.info# 编译./config# 安装(如果有旧版本,可以使用 make uninstall 卸载,然后删除对应文件)makesudo make install# 安装成功后,查看安装信息gmssl version -a
2. 2 生成公私钥对
gmssl ecparam -genkey -name sm2p256v1 -out CAkey.pem
2.3 查看并保留私钥
注意:
请务必复制保存私钥。
gmssl pkey -in CAkey.pem -noout -text
2.4 创建证书请求
gmssl req -utf8 -new -sm3 -key CAkey.pem -out CAcsr.pem
2.5 查看证书请求
gmssl req -in CAcsr.pem -noout -text -subject
3. 解密流程
在拉到核身结果后,EidInfo 中会有 DesKey 和 UserInfo,需要使用上面生成私钥解密。解密过程如下:
使用 SM2 和上面生成的私钥对 DesKey(Base64 decode 成字节数组)解密获得“会话密钥”。
使用会话密钥和sm4算法 ecb 模式(无填充)解密获得明文字符串。
字符串格式为{"name":"姓名","idtype":"01(代表身份证)","idnum":"身份证号"}。
3.1 Demo 代码
GO 代码示例:
// require github.com/tjfoc/gmsm v1.4.1 或者go get github.com/tjfoc/gmsmimport("github.com/tjfoc/gmsm/sm2""github.com/tjfoc/gmsm/sm4""github.com/tjfoc/gmsm/x509")const PrivateKey = "f9b587743f051b1e59efa05125f31b5bf371957bf3d3012c1739091334b73738"const DesKey = "xxx"const UserInfo = "xxx"func decode() {privateKey, err := x509.ReadPrivateKeyFromHex(PrivateKey) //上述私钥16进制dek, _ := base64.StdEncoding.DecodeString(DesKey)sm4Key, err := sm2.Decrypt(privateKey, dek, 0)info, _ := base64.StdEncoding.DecodeString(UserInfo)out, err := sm4.Sm4Ecb(sm4Key, info, false)fmt.Println(string(out), err)}
Java 代码示例:
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.69</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.15</version></dependency>// hutool-all 工具类使用最新版本即可。// bouncycastle 请使用与当前JDK相对应的版本。private static final String PrivateKeyHex = "f9b587743f051b1e59efa05125f31b5bf371957bf3d3012c1739091334b73738";private static final String DesKey = "xxx";private static final String UserInfo = "xxx";public void DecodeUserInfo() {byte[] desKeyBytes = Base64.decode(DesKey);final SM2 sm2 = new SM2(PrivateKeyHex, null, null);sm2.usePlainEncoding();byte[] sm4KeyBytes = sm2.decrypt(desKeyBytes);SymmetricCrypto sm4 = SmUtil.sm4(sm4KeyBytes);byte[] plaintext = sm4.decrypt(Base64.decode(UserInfo));System.out.println(new String(plaintext));}
nodejs 代码示例:
const {SM2, SM4} = require('gm-crypto') const PrivateKeyHex = "f9b587743f051b1e59efa05125f31b5bf371957bf3d3012c1739091334b73738" const DesKey = "xxx" const UserInfo = "xxx" const sm4Key = SM2.decrypt(Buffer.from(DesKey, 'base64').toString("hex").substring(2), PrivateKeyHex, { inputEncoding: 'hex', outputEncoding: 'hex', mode: 1 }) const plaintext = SM4.decrypt(UserInfo, sm4Key, { inputEncoding: 'base64', outputEncoding: 'utf8' }) console.log(plaintext)