【国密证书】CentOS 7 安装 GmSSL 并生成国密证书
1. 安装 GmSSL
GitHub - guanzhi/GmSSL at GmSSL-v2
本篇仅在 CentOS 7 虚拟机上安装 GmSSL 并生成国密证书,可以当做一个工具,日后需要生成国密证书时可以参考本例操作。
官网有三个版本:v1、v2和v3,分别对应GmSSL-v1、GmSSL-v2和master分支。我们这里选择v2版本,如下图,目前v2版本是主流,v3版本与前两个版本相差较大(目前相关资料较少)。
1.1 安装依赖
sudo yum install -y gcc make cmake perl git openssl-devel
1.2 下载并编译 GmSSL
安装官方文档:http://gmssl.org/docs/install.html
文末附安装过程
下载安装GmSSL的核心命令如下:
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 配置环境变量
echo 'export PATH=/usr/local/bin/gmssl:$PATH' >> ~/.bashrc
source ~/.bashrc
1.4 验证安装
gmssl version -a
# 输出应包含 "GmSSL 2.x" 或类似版本信息
例如:
[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 密钥对
gmssl ecparam -genkey -name sm2p256v1 -out sm2.key
- 参数说明:
sm2p256v1
:国密 SM2 椭圆曲线名称。sm2.key
:生成的私钥文件,需妥善保管
- 验证私钥:
检查输出是否包含gmssl pkey -in sm2.key -text -noout
SM2
曲线标识。
⚠️ 注意:私钥文件(.key
)是核心安全资产,切勿泄露或丢失。
3. 创建国密 CSR 文件
使用 SM2
私钥生成证书签名请求(CSR
),需包含国密特定参数:
gmssl req -new -sm3 -key sm2.key -out sm2.csr
- 关键参数:
-sm3
:指定使用国密SM3
哈希算法(替代SHA-256
)。sm2.csr
:生成的证书签名请求文件
- 填写
CSR
信息(交互式或非交互式):- 交互式:运行命令后按提示输入信息(示例):
Country 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
- 非交互式:
gmssl 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 内容:
确认以下字段:gmssl req -in sm2.csr -noout -text
Signature Algorithm: sm2sign-with-sm3
Subject
中的域名信息(如CN=yourdomain.com
)
4. 生成国密 HTTPS 证书
测试环境可用自签证书,生产环境要向CA机构申请签发。
4.1 方案一:自签名证书(测试用途)
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 生成根证书私钥
gmssl ecparam -genkey -name sm2p256v1 -out root.key
- 参数说明:
-name sm2p256v1
指定国密SM2
曲线;-out root.key
输出私钥文件。
5.1.2 创建根证书配置文件 root.cnf
[ 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 生成自签名根证书
gmssl req -new -x509 -sm3 -key root.key -out root.crt \-config root.cnf -extensions root_ext -days 3650
- 验证根证书:
例如:gmssl x509 -in root.crt -text -noout # 输出应含:X509v3 Basic Constraints: critical CA:TRUE
Certificate:Data:Version: 3 (0x2)Serial Number:be:8e:d6:40:89:1d:f6:10Signature Algorithm: sm2sign-with-sm3Issuer: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCAValidityNot Before: Aug 26 14:36:16 2025 GMTNot After : Aug 24 14:36:16 2035 GMTSubject: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCASubject Public Key Info:Public Key Algorithm: id-ecPublicKeyPublic-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:6cASN1 OID: sm2p256v1NIST CURVE: SM2X509v3 extensions:X509v3 Basic Constraints: criticalCA:TRUEX509v3 Key Usage: criticalCertificate Sign, CRL SignSignature Algorithm: sm2sign-with-sm330: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 生成服务器私钥
gmssl ecparam -genkey -name sm2p256v1 -out server.key
5.2.2 生成服务器证书请求(CSR)
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 使用根证书签发服务器证书
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
启用加密功能。
例如:Signature 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 生成客户端私钥
gmssl ecparam -genkey -name sm2p256v1 -out client.key
5.3.2 生成客户端证书请求(CSR)
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 使用根证书签发客户端证书
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 验证服务器证书
gmssl verify -CAfile root.crt server.crt
- 输出
server.crt: OK
表示验证通过。
5.4.2 验证客户端证书
gmssl verify -CAfile root.crt client.crt
5.4.3 查看证书详情
gmssl x509 -in server.crt -text -noout | grep "Signature Algorithm"
检查输出是否为 sm2sign-with-sm3
,确认国密算法生效
这里请您看下gmssl x509 -in server.crt -text -noout
命令的原文:
Certificate:Data:Version: 3 (0x2)Serial Number:e0:da:85:d5:da:1b:1a:01Signature Algorithm: sm2sign-with-sm3Issuer: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCAValidityNot Before: Aug 26 14:39:05 2025 GMTNot After : Aug 26 14:39:05 2026 GMTSubject: C = CN, ST = Beijing, L = Beijing, O = MyServer, OU = IT, CN = server.example.comSubject Public Key Info:Public Key Algorithm: id-ecPublicKeyPublic-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:beASN1 OID: sm2p256v1NIST CURVE: SM2X509v3 extensions:X509v3 Key Usage:Digital Signature, Key EnciphermentSignature Algorithm: sm2sign-with-sm330: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 服务器证书链
gmssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 \-name server -CAfile root.crt -passout pass:"密码"
5.5.2 客户端证书链
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
,避免未授权访问:chmod 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
资料下载
- GmSSL安装过程
- 基于GmSSL进行国密SSL证书签发过程
参考资料
http://gmssl.org/docs/quickstart.html
https://github.com/guanzhi/GmSSL/tags
https://blog.csdn.net/markximo/article/details/128124885