下面是使用 GmSSL 生成 `*.example.com` 通配符 SM2 国密证书的完整制作流程。
一、工具准备
标准 OpenSSL(包括 3.0 版本)默认不支持 SM2/SM3/SM4 国密算法,需使用国密分支版本。推荐以下两种方式之一:
方式一:GmSSL(推荐)
GmSSL 是 OpenSSL 的国密分支,支持 SM2/SM3/SM4/SM9 等算法,可在 https://gmssl.org 下载安装。
方式二:OpenSSL + 国密引擎(openssl-gm)
部分国产操作系统(如 OpenEuler)提供了 openssl-gm 包,可直接通过包管理器安装:
bash
sudo apt install openssl-gm # Ubuntu 22.04 + openssl-gm
注意:GmSSL 已停止维护,生产环境建议使用信创发行版(如华为 OpenEuler)内置的 openssl-gm 或商业国密 SSL 产品。
二、生成 SM2 私钥
使用 GmSSL 生成 SM2 私钥:
bash
gmssl ecparam -genkey -name sm2p256v1 -out sm2.key
其中 `-name sm2p256v1` 指定使用 SM2 推荐椭圆曲线。
三、生成通配符 CSR
3.1 基础 CSR 生成命令
bash
gmssl req -new -key sm2.key -out sm2.csr -sm3 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=ExampleOrg/OU=IT Dept/CN=*.example.com"
参数说明:
参数 说明
`-new` 新建证书请求
`-key` 指定私钥文件 `-out` | 输出 CSR 文件
`-sm3` SM3 哈希算法(国密标准摘要算法)
`-subj` 证书主题(DN)
`CN=*.example.com` 通配符域名,可匹配同级的任意子域名
注意:通配符 `*.example.com` 只能匹配 `sub.example.com` 等同级子域名,不包含 `xx.sub.example.com` 二级子域名,也不包含顶级域名 `example.com` 本身。
3.2 同时支持多个域名(可选)
如需证书同时支持多个域名(含通配符),有两种方式:
方式一:扩展 CSR 的 subjectAltName 字段
创建 `csr.cnf` 配置文件:
ini
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = ExampleOrg
OU = IT Dept
CN = *.example.com
[v3_req]
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.example.com
DNS.2 = example.com
DNS.3 = *.example.cn
执行:
bash
gmssl req -new -key sm2.key -out sm2.csr -sm3 -config csr.cnf
方式二(生产环境推荐):申请商用国密通配符证书时,直接在 CSR 中以 `CN=*.example.com` 提交,部分 CA 支持在申请界面额外添加 SAN 域名。
四、签发证书
4.1 自签名证书(测试/内网环境)
bash
gmssl x509 -req -days 365 -in sm2.csr -signkey sm2.key -out sm2.crt -sm3
参数说明:
参数 说明
`-x509`(变体) 输出 X.509 格式自签名证书
`-days 365` 有效期 365 天
`-in` CSR 文件
`-signkey` 自签名使用的私钥
`-sm3` SM3 摘要算法
或使用 CA 签发流程:bash
# 生成 CA 根私钥
gmssl ecparam -genkey -name sm2p256v1 -out ca.key
# 生成 CA 根证书(自签名)
gmssl req -x509 -new -key ca.key -out ca.crt -days 3650 -sm3 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=ExampleCA/CN=Example Root CA"
# 使用 CA 签发服务器证书
gmssl x509 -req -days 365 -in sm2.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out sm2.crt -sm3
4.2 商用国密证书(生产环境)
国合规 CA 机构(如数安时代 GDCA、沃通 Wosign、环安信 KeepTrust 等)受理 CSR 后签发正式证书。商用证书通常区分签名证书和加密证书两个文件(PEM 格式),分别对应不同的密钥用途。
申请流程概览:国内商用国密证书的申请流程大致为:提交身份证明材料 → 等待机构审核 → 下载证书文件。各家 CA 每年都会更新接口,具体操作建议访问相关 CA 官网获取最新指南。
五、国密双证书的重要说明
国密 SSL 协议需要配置双证书:一张用于签名数字签名(身份认证),一张用于加密数据交换(密钥协商)。
证书类型 密钥用途 生成方式
签名证书 数字签名 本地生成密钥对 → 生成 CSR → CA 签发
加密证书 数据加解密 通常由 CA 生成(部分方案支持本地生成私钥)
5.1 同时生成签名证书和加密证书的私钥
bash
# 生成签名证书私钥和 CSR
gmssl ecparam -genkey -name sm2p256v1 -out sign.key
gmssl req -new -key sign.key -out sign.csr -sm3 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=ExampleOrg/CN=*.example.com"
# 生成加密证书私钥和 CSR
gmssl ecparam -genkey -name sm2p256v1 -out encrypt.key
gmssl req -new -key encrypt.key -out encrypt.csr -sm3 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=ExampleOrg/CN=*.example.com"
两种私钥均可使用通配符 `CN=*.example.com`。商用环境中,加密证书私钥也可能由 CA 颁发并下发,无需本地生成。
5.2 使用双证书签发
bash
# 签发签名证书
gmssl x509 -req -days 365 -in sign.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out sign.crt -sm3
# 签发加密证书
gmssl x509 -req -days 365 -in encrypt.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out encrypt.crt
六、验证证书
生成后建议验证 SM2 公钥和 SM3 签名算法是否正确:
bash
# 查看公钥类型(应显示 sm2p256v1)
gmssl x509 -in sm2.crt -text -noout | grep "pub:"
# 查看签名算法(应显示 sm2sign 或 OID 1.2.156.10197.1.501)
gmssl x509 -in sm2.crt -text -noout | grep "Signature Algorithm"
# 验证签名有效性(应返回 OK)
gmssl verify -CAfile ca.crt sm2.crt
七、部署配置要点
以 Nginx 为例,部署 SM2 国密证书时的核心配置:
nginx
server {
listen 443 ssl;
server_name *.example.com;
# 国密双证书配置
ssl_certificate /path/to/sign.crt; # 签名证书
ssl_certificate_key /path/to/sign.key; # 签名私钥
ssl_verify_client off;
# 需安装支持国密的 Nginx(如 Tengine-GM 或 Nginx + GmSSL 补丁)
# 国密密码套件示例
ssl_ciphers ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-CBC-SM3;
}
生产环境建议:内部生产可自建 CA 搭建国密证书体系;公网生产建议向国密合规 CA 机构申请正式商用国密证书,并同时部署 RSA 国际证书实现双证书过渡,兼顾国密合规与广泛兼容性。