用户要为各应用自动化签发国密证书,市面上并没有一个能直接通吃的“一键脚本”,核心方案通常分两类:

      自建内部CA:用GmSSL或TASSL这类工具搭建一个内部的国密CA(证书颁发中心),由它来为你的内部服务批量签发与管理证书。这种方式证书完全自主可控,适合内部系统(如开发测试、微服务、中间件)。

      对接公共CA:使用开源的  SM2cerBot  客户端,对接如零信技术等提供的国密ACME公共服务,自动化申请和续期有效期90天、受浏览器及国密标准信任的公网SSL证书

下面是实现集中签发或申请的几种主流方案。

方案一:使用GmSSL  +  Shell脚本(自建CA批量签发)

如果你想搭建一个内部的国密证书签发中心,最灵活的方式是使用GmSSL并编写脚本。核心就是围绕`gmssl`命令进行二次封装,通过几个基本步骤的组合来自动化生成证书链:

1.    根CA(根证书颁发机构)初始化

        生成根CA的SM2私钥,并生成自己的证书:

        bash

        #  1.  生成根CA的SM2私钥

        gmssl  ecparam  -genkey  -name  sm2p256v1  -out  private/root-cakey.pem

        #  2.  生成根CA的证书请求

        gmssl  req  -new  -sm3  -key  private/root-cakey.pem  -out  root-cacsr.pem

        #  3.  根CA自签名,生成最终根证书

        gmssl  req  -x509  -sm3  -days  365  -key  private/root-cakey.pem  -out  root-cacert.pem

2.    服务端证书签发

        为每个服务端生成独立的私钥和证书请求文件(CSR),再用根CA签发证书:

        bash

        #  1.  为服务端生成SM2私钥

        gmssl  ecparam  -genkey  -name  sm2p256v1  -out  server.key

        #  2.  生成证书请求文件  (CSR)

        gmssl  req  -new  -sm3  -key  server.key  -out  server.csr  -subj  "/CN=your.domain.com"

        #  3.  用根CA完成签发

        gmssl  ca  -md  sm3  -in  server.csr  -out  server.crt  -days  365  \

                        -cert  root-cacert.pem  -keyfile  private/root-cakey.pem

      应用的核心思想是将这个流程模板化,配合配置文件对证书主体等信息(如`-subj`参数中的`CN`)进行变量传递,放入循环,再将生成的证书文件按节点命名,即可实现批量签发。

方案二:使用GmSSL内置gmca工具(简化CA管理)

如果你不想从零编写CA签发流程的脚本,GmSSL内置的`gmca`工具是一个更省力的选择。它是一套现成的命令行工具,可以快速建立并管理一个本地CA,免去了你手动管理`serial`、`index.txt`等CA数据库文件的繁琐。

该方案在GmSSL的官方文档“国密CA”部分也有详细介绍。其基础工作流程如下:

  阶段                  命令                                                                                                                        说明                      

初始化CA          `gmca  -setup`                                                                                                      生成CA根证书与私钥  

生成请求          `gmca  -gencsr  <证书通用名>`                                                                          为终端生成CSR      

执行签发            `gmca  -signcsr  <证书通用名>`                                                                        对CSR签名并生成证书  

查询管理          `gmca  -listcsrs`  <br>  `gmca  -listcerts`  <br>  `gmca  -revokecertbyserial  <序列号>`      查看CSR<br>查看已签发证书<br>吊销证书  

方案三:使用SM2cerBot(一键对接公共CA)

你的应用如果**需要面向公网提供服务**,让用户访问时浏览器地址栏显示安全锁,则需要使用由公共CA签发的、受信任的国密SSL证书

此种情况下,推荐使用开源项目**SM2cerBot**。它是一款国密ACME客户端,可以自动化对接零信技术等提供的国密ACME公共服务,一站式完成证书的**申请、获取、部署和自动续期**。它的运维复杂度极低,步骤如下:

1.    安装与配置:编译并配置好SM2cerBot,在Web服务器上开放域名验证目录。

2.    运行并申请:执行一条指定邮箱、域名等参数的命令,客户端将自动与ACME服务交互并验证域名归属,完成证书的自动申请和部署。

3.    实现自动循环:通过设置`crontab`定时任务,让SM2cerBot定期检查并自动续期快过期的证书,实现全自动管理。

方案四:使用TASSL双证书脚本(符合国密TLS标准)

值得注意的是,国密TLS标准(如GMT  0024)要求使用签名证书和加密证书这一对“双证书”,以实现密钥的独立管理和可监管性。

如果你的应用场景需要严格遵循国密标准,可以考虑另一个基于OpenSSL的国密实现——TASSL。在其源码中提供了完整的双证书生成脚本,主要特点如下:

      生成整套测试证书:`SM2certgen.sh`脚本位于TASSL源码的`Tassl_demo/mk_tls_cert/`目录下,可以一键生成包含根证书、服务器签名证书、服务器加密证书等全套用于测试的国密双证书。

      支持节点批量生成:通过修改脚本中的循环逻辑,可以实现为多个节点批量生成其独有的签名和加密密钥对(例如命名输出为`node1_sign.key`与`node1_sign.crt`等),这为部署国密集群(如基于FISCO  BCOS的区块链网络)提供了极大便利。

常见问题与预防

在进行国密证书的自动化签发时,有几个常见的“坑”需要特别留意:

      证书一致性检查:在证书生效后,务必使用`gmssl  x509  -in  server.crt  -text  -noout`命令仔细检查证书的基本约束、密钥用法和扩展信息,验签时务必明确签名算法为`-sm3`,确保符合预期。

      环境差异化支持:自动化脚本应尽可能考虑跨平台的兼容性。例如,可以优先探测并使用`tongsuo`命令,若不存在则回退使用`openssl`,并增加必要的版本检查,确保脚本在各个系统环境下都能正常运行。

如知道目前的证书主要用在什么类型的业务上呢?是内部微服务调用还是面向公网的网站?告诉我大概的服务器集群规模,我可以帮朱评估更适合用哪个方案。