用户搭建国密 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`脚本则能让你更高效地管理证书。
需要注意的是,国密生态仍在建设中,不同工具和服务器对国密的实现可能存在差异,遇到问题时多查阅官方文档会是更可靠的选择。