用户搭建国密  CA  测试环境,最便捷的方式是使用  `gmssl`  命令行工具,通过一系列命令手动生成根证书。如果想更省事,也可以直接用  `gmca`  脚本工具,它能自动完成目录创建、证书生成等繁琐步骤。

下面我介绍这两种主流方法,用户可以根据自己的情况选择。

1.  环境准备  (GmSSL  的安装与配置)

首先要安装  `GmSSL`  这个开源密码工具箱,它是整个操作的基础。

Ubuntu/Debian:

        bash

        sudo  apt  install  gmssl

        *(注:某些系统源可能不包含,建议从源码编译最新的GmSSL。)*

CentOS/RHEL:

        `bash

        sudo  yum  install  gmssl

2.  方法一:手动生成根CA证书(适合理解流程)

这种方法手动执行每个步骤,适合希望在命令中理解整个过程的朋友。这是最常见的方式。

1.    创建CA目录结构

        首先创建几个必要的目录和文件,GmSSL  会用到它们。

        bash

        mkdir  -p  demoCA/{certs,crl,newcerts,private}

        touch  demoCA/index.txt

        echo  "01"  >  demoCA/serial

        `certs/`:  存放已颁发的证书

        `crl/`:  存放证书吊销列表  (CRL)

        `newcerts/`:  存放新生成的证书副本

        `private/`:  存放CA的私钥,需严格保护

        `index.txt`:  CA的证书颁发数据库

        `serial`:  下一个证书的序列号

2.    生成根CA私钥

        为根CA生成一个SM2的私钥,这是整个CA体系的信任起点。该命令会在  `demoCA/private/`  目录下生成  `root-cakey.pem`  私钥文件。

        bash

        #  进入刚刚创建的demoCA目录

        cd  demoCA

        #  生成SM2私钥,存放在private目录下

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

3.    生成根CA证书请求

        基于上一步的私钥,生成一个证书请求文件  (CSR),里面包含了根CA的身份信息。

        bash

        #  生成证书请求文件,算法采用SM3

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

        执行命令后,需要交互式地填写证书的国家、省份、城市、组织名等信息。根据提示输入即可。

4.    自签名生成根CA证书

        最后,用根CA自己的私钥对CSR进行自签名,正式生成根证书。

        bash

        #  生成自签名根证书,有效期365天

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

现在,你就拥有了一个有效的国密根CA,包含  `root-cacert.pem`(根证书)和  `private/root-cakey.pem`(根私钥)。

3.  方法二:使用`gmca`脚本快速搭建(适合自动化)

`gmca`  是一个GmSSL官方提供的高级管理工具,它将创建CA、签发证书等操作封装成了简单的命令,可以大大简化工作量。

1.    自动初始化CA

        `gmca  --setup`  命令是搭建环境的“一键式”解决方案。

        bash

        #  在一个空目录执行,gmca会自动创建所有必要的文件和证书

        gmca  --setup

        这条命令会自动生成一个根CA,包括私钥、自签名证书和数据库。执行后,当前目录下会出现  `demoCA`  文件夹和  `rootCaCert.pem`(根证书)。

2.    生成和签发证书

        初始化后,就可以轻松地为其他实体(如Nginx服务器)生成和签发证书了。

        生成证书请求  (CSR):  `gmca  --gencsr  <CommonName>`  会生成一个以“CommonName”命名的证书请求文件。

        签发证书:  `gmca  --signcsr  <CommonName>`  使用刚生成的根CA来签发该证书请求。

        查看证书:  `gmca  --listcerts`  可以列出所有已签发的证书。

4.  重要注意事项

1.    私钥安全:  根证书的私钥  (`root-cakey.pem`)  是整个PKI体系的核心,必须严格保密。测试环境中,务必不要将其公开或分发。

2.    私钥格式:  如果用Nginx等Web服务器(如使用  `tencentnginx`),可能需要将私钥从PEM文本格式转换为PKCS#8格式。

3.    双证书机制:  国密SSL需要签名证书和加密证书两张证书。

4.    证书使用场景:

        根CA证书:  客户端如浏览器、curl等用于验证服务器证书的信任锚,绝不在TLS握手时直接使用。

        服务器证书:  部署在Web服务器上,用于日常的TLS通信。

5.  常见问题排查

错误:  "openssl.cnf  not  found"

        原因:  `gmssl`找不到配置文件。

        解决方法:  手动指定配置文件路径,在命令后加上  `-config  /path/to/openssl.cnf`。可以通过  `find  /  -name  openssl.cnf  2>/dev/null`  查找文件位置。

通信测试失败

        原因:  GmSSL默认配置可能依赖于标准的OpenSSL引擎,与国密的TLCP协议不兼容。

        解决方法:  必须使用`gmssl`的`s_server`和`s_client`命令进行测试。启动服务端使用`-gmtls`参数:

                bash

                gmssl  s_server  -gmtls  -cert  server_sign.crt  -key  server_sign.key  -dcert  server_encrypt.crt  -dkey  server_encrypt.key  -accept  4433

                客户端连接使用:

                bash

                gmssl  s_client  -gmtls  -connect  127.0.0.1:4433

                这样才能成功建立国密TLCP连接。

总结

搭建个人国密CA测试环境,核心是掌握  `gmssl`  工具的使用。手动生成根CA能让你熟悉证书的完整生命周期;而`gmca`脚本则能让你更高效地管理证书。

需要注意的是,国密生态仍在建设中,不同工具和服务器对国密的实现可能存在差异,遇到问题时多查阅官方文档会是更可靠的选择。