下面是使用  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  国际证书实现双证书过渡,兼顾国密合规与广泛兼容性。