1. 安装 GmSSL
GitHub - guanzhi/GmSSL at GmSSL-v2
本篇仅在 CentOS 7 虚拟机上安装 GmSSL 并生成国密证书,可以当做一个工具,日后需要生成国密证书时可以参考本例操作。
官网有三个版本:v1、v2和v3,分别对应GmSSL-v1、GmSSL-v2和master分支。我们这里选择v2版本,如下图,目前v2版本是主流,v3版本与前两个版本相差较大(目前相关资料较少)。
1.1 安装依赖
bash
sudo yum install -y gcc make cmake perl git openssl-devel
1.2 下载并编译 GmSSL
安装官方文档:http://gmssl.org/docs/install.html
文末附安装过程
下载安装GmSSL的核心命令如下:
bash
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
git branch -a
git checkout -b GmSSL-v2 remotes/origin/GmSSL-v2
./config
make
make test
sudo make install
gmssl version -a
sudo ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
sudo ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
gmssl version -a
1.3 配置环境变量
bash
echo 'export PATH=/usr/local/bin/gmssl:$PATH' >> ~/.bashrc
source ~/.bashrc
1.4 验证安装
bash
gmssl version -a
# 输出应包含 "GmSSL 2.x" 或类似版本信息
例如:
bash
[vagrant@vbox ssl]$ gmssl version -a
GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019
built on: reproducible build, date unspecified
platform: linux-x86_64
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DGMI_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/local/ssl\"" -DENGINESDIR="\"/usr/local/lib64/engines-1.1\"" -Wa,--noexecstack
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/lib64/engines-1.1"
2. 生成 SM2 密钥对
bash
gmssl ecparam -genkey -name sm2p256v1 -out sm2.key
-
参数说明:
sm2p256v1
:国密 SM2 椭圆曲线名称。sm2.key
:生成的私钥文件,需妥善保管
-
验证私钥:
bashgmssl pkey -in sm2.key -text -noout
检查输出是否包含
SM2
曲线标识。
⚠️ 注意:私钥文件(.key
)是核心安全资产,切勿泄露或丢失。
3. 创建国密 CSR 文件
使用 SM2
私钥生成证书签名请求(CSR
),需包含国密特定参数:
bash
gmssl req -new -sm3 -key sm2.key -out sm2.csr
-
关键参数:
-sm3
:指定使用国密SM3
哈希算法(替代SHA-256
)。sm2.csr
:生成的证书签名请求文件
-
填写
CSR
信息(交互式或非交互式):-
交互式:运行命令后按提示输入信息(示例):
bashCountry Name (2 letter code) []: CN State or Province Name []: Beijing Locality Name []: Beijing Organization Name []: Your Company Organizational Unit Name []: IT Common Name []: yourdomain.com # 必须与域名一致 Email Address []: admin@yourdomain.com
-
非交互式:
bashgmssl req -new -sm3 -key sm2.key -out sm2.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Your Company/OU=IT/CN=yourdomain.com"
-
-
验证 CSR 内容:
bashgmssl req -in sm2.csr -noout -text
确认以下字段:
Signature Algorithm: sm2sign-with-sm3
Subject
中的域名信息(如CN=yourdomain.com
)
4. 生成国密 HTTPS 证书
测试环境可用自签证书,生产环境要向CA机构申请签发。
4.1 方案一:自签名证书(测试用途)
bash
gmssl req -x509 -sm3 -days 365 -key sm2.key -in sm2.csr -out sm2.crt
- 参数说明:
-x509
:生成自签名证书。-days 365
:证书有效期(天)
4.2 方案二:向 CA 机构申请(生产环境)
- 提交
CSR
文件
将sm2.csr
提交至支持国密的CA
机构(如CFCA
、JoySSL
)。 - 完成域名验证
DNS
验证:在域名解析中添加CA
指定的TXT
记录。- 文件验证:在网站根目录放置验证文件。
- 下载证书
审核通过后,CA
会签发国密证书(格式通常为.crt
或.pem
)
5. 生成整套国密HTTPS证书
文末附证书签发过程
5.1 生成根证书(Root CA)
5.1.1 生成根证书私钥
bash
gmssl ecparam -genkey -name sm2p256v1 -out root.key
- 参数说明:
-name sm2p256v1
指定国密SM2
曲线;-out root.key
输出私钥文件。
5.1.2 创建根证书配置文件 root.cnf
conf
[ req ]
distinguished_name = req_distinguished_name
prompt = no
[ req_distinguished_name ]
C = CN
ST = Beijing
L = Beijing
O = MyRootCA
OU = CA
CN = RootCA
[ root_ext ]
basicConstraints = critical,CA:TRUE
keyUsage = critical,keyCertSign,cRLSign
- 关键字段:
CA:TRUE
声明为根证书,keyCertSign
允许签发子证书。
5.1.3 生成自签名根证书
bash
gmssl req -new -x509 -sm3 -key root.key -out root.crt \
-config root.cnf -extensions root_ext -days 3650
-
验证根证书:
bashgmssl x509 -in root.crt -text -noout # 输出应含:X509v3 Basic Constraints: critical CA:TRUE
例如:
bashCertificate: Data: Version: 3 (0x2) Serial Number: be:8e:d6:40:89:1d:f6:10 Signature Algorithm: sm2sign-with-sm3 Issuer: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCA Validity Not Before: Aug 26 14:36:16 2025 GMT Not After : Aug 24 14:36:16 2035 GMT Subject: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCA Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:e4:9f:24:e2:be:dc:a0:f9:ee:d6:ff:37:94:e3: 15:e1:d4:43:16:3d:2c:6c:13:0e:dc:7f:c3:4e:c8: 35:b5:b9:50:0d:f0:73:6e:3d:04:a5:d3:d4:80:70: 94:0e:57:bf:1a:0c:fa:14:c8:36:13:9b:64:6f:eb: 51:6b:e6:ce:6c ASN1 OID: sm2p256v1 NIST CURVE: SM2 X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Certificate Sign, CRL Sign Signature Algorithm: sm2sign-with-sm3 30:44:02:20:06:6c:d4:fa:2f:d8:5b:56:14:60:db:37:b7:be: f5:90:62:35:e6:8b:b2:83:75:2d:9d:40:e1:a7:6c:72:0d:c0: 02:20:73:86:6b:7b:bd:15:71:4f:af:75:7a:cc:a0:39:70:e0: 34:78:77:5f:7a:d2:7b:cb:e9:af:28:5f:de:61:b4:0e
5.2 生成服务器证书(Server Certificate)
5.2.1 生成服务器私钥
bash
gmssl ecparam -genkey -name sm2p256v1 -out server.key
5.2.2 生成服务器证书请求(CSR)
bash
gmssl req -new -sm3 -key server.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyServer/OU=IT/CN=server.example.com"
- 注意:
CN
为服务器域名(如server.example.com
)。
5.2.3 使用根证书签发服务器证书
bash
gmssl x509 -req -days 365 -sm3 -in server.csr -CA root.crt -CAkey root.key -CAcreateserial -out server.crt \
-extfile <(echo "keyUsage=digitalSignature,keyEncipherment") # 服务器证书用途
- 参数说明:
-
-CA
和-CAkey
指定根证书及私钥;-extfile
定义密钥用途(加密与签名)。 -
-CAcreateserial
生成序列号文件;keyEncipherment
启用加密功能。
例如:bashSignature ok subject=C = CN, ST = Beijing, L = Beijing, O = MyServer, OU = IT, CN = server.example.com Getting CA Private Key
-
5.3 生成客户端证书(Client Certificate)
5.3.1 生成客户端私钥
bash
gmssl ecparam -genkey -name sm2p256v1 -out client.key
5.3.2 生成客户端证书请求(CSR)
bash
gmssl req -new -sm3 -key client.key -out client.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyClient/OU=IT/CN=client.example.com"
5.3.3 使用根证书签发客户端证书
bash
gmssl x509 -req -days 365 -sm3 -in client.csr -CA root.crt -CAkey root.key -CAcreateserial -out client.crt \
-extfile <(echo "keyUsage=digitalSignature") # 客户端证书仅需签名功能
5.4 验证证书链
5.4.1 验证服务器证书
bash
gmssl verify -CAfile root.crt server.crt
- 输出
server.crt: OK
表示验证通过。
5.4.2 验证客户端证书
bash
gmssl verify -CAfile root.crt client.crt
5.4.3 查看证书详情
bash
gmssl x509 -in server.crt -text -noout | grep "Signature Algorithm"
检查输出是否为 sm2sign-with-sm3
,确认国密算法生效
这里请您看下gmssl x509 -in server.crt -text -noout
命令的原文:
bash
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
e0:da:85:d5:da:1b:1a:01
Signature Algorithm: sm2sign-with-sm3
Issuer: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCA
Validity
Not Before: Aug 26 14:39:05 2025 GMT
Not After : Aug 26 14:39:05 2026 GMT
Subject: C = CN, ST = Beijing, L = Beijing, O = MyServer, OU = IT, CN = server.example.com
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:14:f0:7f:b2:62:2d:76:81:78:8b:71:d1:c4:0b:
f7:e3:d2:b2:a7:ec:7d:9c:b2:51:77:1c:d3:38:8c:
a8:3f:de:a7:7b:73:9b:91:5b:1d:20:cc:31:49:de:
b1:0e:7d:31:59:21:88:32:9f:e0:d8:a3:ec:6f:70:
d4:5f:a3:bb:be
ASN1 OID: sm2p256v1
NIST CURVE: SM2
X509v3 extensions:
X509v3 Key Usage:
Digital Signature, Key Encipherment
Signature Algorithm: sm2sign-with-sm3
30:45:02:21:00:86:16:08:80:94:90:bd:a7:eb:8c:37:cc:63:
ce:d8:ed:34:11:7c:3b:8a:ea:79:d2:e9:2c:f7:fb:31:0a:a2:
87:02:20:75:63:21:ea:3b:20:31:d1:33:27:1a:35:b8:23:cc:
23:96:d4:09:39:ba:6c:0a:98:af:a9:02:84:45:f1:29:d3
5.5 导出PKCS12
格式
5.5.1 服务器证书链
bash
gmssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 \
-name server -CAfile root.crt -passout pass:"密码"
5.5.2 客户端证书链
bash
gmssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 \
-name client -CAfile root.crt -passout pass:"密码"
6. 注意事项
.key
、.csr
、.crt
、.pem
是SSL/TLS
证书管理中的核心文件,区别如下:
文件类型 | 核心作用 | 内容 | 保密性 | 格式特点 | 典型用途 |
---|---|---|---|---|---|
.key |
服务器私钥 | 加密算法的私钥数据(如 RSA 、SM2 ) |
绝对私密 | 通常为 PEM 格式(文本),以 -----BEGIN PRIVATE KEY----- 开头 |
解密数据、生成签名 |
.csr |
证书签名请求 | 公钥 + 申请人信息(域名、组织等) + 数字签名 | 公开 | PEM 编码,以 -----BEGIN CERTIFICATE REQUEST----- 开头 |
向 CA 申请证书 |
.crt |
CA 签发的证书 |
公钥 + 持有者信息 + CA 签名 + 有效期 |
公开 | 支持 PEM (文本)或 DER (二进制),以 -----BEGIN CERTIFICATE----- 开头(PEM 格式) |
客户端验证服务器身份 |
.pem |
通用容器(可存储多种加密对象) | 证书、私钥、CSR 等(取决于内容标识) |
可能含私钥 | Base64 编码的文本,以 -----BEGIN XXX----- 开头(如 CERTIFICATE 、PRIVATE KEY ) |
跨平台传输、合并存储多对象 |
-
文件权限
私钥权限设为600
,避免未授权访问:bashchmod 600 *.key
-
生产环境建议
- 自签名证书仅用于测试,生产环境需向合规 CA(如 CFCA、JoySSL)申请国密证书。
- 部署时启用双向认证(服务端验证客户端证书),并配置 CRL(证书吊销列表)
-
浏览器兼容性
主流浏览器(Chrome/Firefox)不支持国密证书,需使用 国密浏览器(如 360安全浏览器)
7. 总结
步骤 | 核心命令 |
---|---|
根证书生成 | gmssl req -new -x509 -sm3 -key root.key -out root.crt |
服务器证书签发 | gmssl x509 -req -sm3 -in server.csr -CA root.crt -CAkey root.key -out server.crt |
客户端证书签发 | gmssl x509 -req -sm3 -in client.csr -CA root.crt -CAkey root.key -out client.crt |
验证证书链 | gmssl verify -CAfile root.crt server.crt |
导出 PKCS12 | gmssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 |
执行完毕后,将得到完整的国密证书链:
- 根证书:
root.crt
- 服务器证书:
server.crt
+server.key
- 客户端证书:
client.crt
+client.key
部署到 Spring Boot 时,将server.p12
和client.p12
分别放入服务端与客户端的resources
目录,并配置application.yml
资料下载
参考资料
http://gmssl.org/docs/quickstart.html