用户要为各应用自动化签发国密证书,市面上并没有一个能直接通吃的“一键脚本”,核心方案通常分两类:
自建内部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`,并增加必要的版本检查,确保脚本在各个系统环境下都能正常运行。
如知道目前的证书主要用在什么类型的业务上呢?是内部微服务调用还是面向公网的网站?告诉我大概的服务器集群规模,我可以帮朱评估更适合用哪个方案。