【国密证书】CentOS 7 安装 GmSSL 并生成国密证书

1. 安装 GmSSL

GitHub - guanzhi/GmSSL at GmSSL-v2

本篇仅在 CentOS 7 虚拟机上安装 GmSSL 并生成国密证书,可以当做一个工具,日后需要生成国密证书时可以参考本例操作。

官网有三个版本:v1、v2和v3,分别对应GmSSL-v1、GmSSL-v2和master分支。我们这里选择v2版本,如下图,目前v2版本是主流,v3版本与前两个版本相差较大(目前相关资料较少)。

1.1 安装依赖

bash 复制代码
sudo yum install -y gcc make cmake perl git openssl-devel

1.2 下载并编译 GmSSL

安装官方文档:http://gmssl.org/docs/install.html

文末附安装过程

下载安装GmSSL的核心命令如下:

bash 复制代码
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
git branch -a
git checkout -b GmSSL-v2 remotes/origin/GmSSL-v2
./config
make
make test
sudo make install
gmssl version -a
sudo ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
sudo ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
gmssl version -a

1.3 配置环境变量

bash 复制代码
echo 'export PATH=/usr/local/bin/gmssl:$PATH' >> ~/.bashrc
source ~/.bashrc

1.4 验证安装

bash 复制代码
gmssl version -a
# 输出应包含 "GmSSL 2.x" 或类似版本信息

例如:

bash 复制代码
[vagrant@vbox ssl]$ gmssl version -a
GmSSL 2.5.4 - OpenSSL 1.1.0d  19 Jun 2019
built on: reproducible build, date unspecified
platform: linux-x86_64
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DGMI_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/local/ssl\"" -DENGINESDIR="\"/usr/local/lib64/engines-1.1\""  -Wa,--noexecstack
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/lib64/engines-1.1"

2. 生成 SM2 密钥对

bash 复制代码
gmssl ecparam -genkey -name sm2p256v1 -out sm2.key
  • 参数说明:

    • sm2p256v1:国密 SM2 椭圆曲线名称。
    • sm2.key:生成的私钥文件,需妥善保管
  • 验证私钥:

    bash 复制代码
    gmssl pkey -in sm2.key -text -noout

    检查输出是否包含 SM2 曲线标识。
    ⚠️ 注意:私钥文件(.key)是核心安全资产,切勿泄露或丢失。

3. 创建国密 CSR 文件

使用 SM2 私钥生成证书签名请求(CSR),需包含国密特定参数:

bash 复制代码
gmssl req -new -sm3 -key sm2.key -out sm2.csr
  • 关键参数:

    • -sm3:指定使用国密 SM3 哈希算法(替代 SHA-256)。
    • sm2.csr:生成的证书签名请求文件
  • 填写 CSR 信息(交互式或非交互式):

    • 交互式:运行命令后按提示输入信息(示例):

      bash 复制代码
      Country Name (2 letter code) []: CN  
      State or Province Name []: Beijing  
      Locality Name []: Beijing  
      Organization Name []: Your Company  
      Organizational Unit Name []: IT  
      Common Name []: yourdomain.com  # 必须与域名一致  
      Email Address []: admin@yourdomain.com  
    • 非交互式:

      bash 复制代码
      gmssl req -new -sm3 -key sm2.key -out sm2.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Your Company/OU=IT/CN=yourdomain.com"
  • 验证 CSR 内容:

    bash 复制代码
    gmssl req -in sm2.csr -noout -text

    确认以下字段:

    • Signature Algorithm: sm2sign-with-sm3
    • Subject 中的域名信息(如 CN=yourdomain.com

4. 生成国密 HTTPS 证书

测试环境可用自签证书,生产环境要向CA机构申请签发。

4.1 方案一:自签名证书(测试用途)

bash 复制代码
gmssl req -x509 -sm3 -days 365 -key sm2.key -in sm2.csr -out sm2.crt
  • 参数说明:
    • -x509:生成自签名证书。
    • -days 365:证书有效期(天)

4.2 方案二:向 CA 机构申请(生产环境)

  1. 提交 CSR 文件
    sm2.csr 提交至支持国密的 CA 机构(如 CFCAJoySSL)。
  2. 完成域名验证
    • DNS 验证:在域名解析中添加 CA 指定的 TXT 记录。
    • 文件验证:在网站根目录放置验证文件。
  3. 下载证书
    审核通过后,CA 会签发国密证书(格式通常为 .crt.pem

5. 生成整套国密HTTPS证书

文末附证书签发过程

5.1 生成根证书(Root CA)

5.1.1 生成根证书私钥

bash 复制代码
gmssl ecparam -genkey -name sm2p256v1 -out root.key
  • 参数说明:
    -name sm2p256v1 指定国密 SM2 曲线;-out root.key 输出私钥文件。

5.1.2 创建根证书配置文件 root.cnf

conf 复制代码
[ req ]
distinguished_name = req_distinguished_name
prompt = no
[ req_distinguished_name ]
C = CN
ST = Beijing
L = Beijing
O = MyRootCA
OU = CA
CN = RootCA
[ root_ext ]
basicConstraints = critical,CA:TRUE
keyUsage = critical,keyCertSign,cRLSign
  • 关键字段:CA:TRUE 声明为根证书,keyCertSign 允许签发子证书。

5.1.3 生成自签名根证书

bash 复制代码
gmssl req -new -x509 -sm3 -key root.key -out root.crt \
  -config root.cnf -extensions root_ext -days 3650
  • 验证根证书:

    bash 复制代码
    gmssl x509 -in root.crt -text -noout
    # 输出应含:X509v3 Basic Constraints: critical CA:TRUE

    例如:

    bash 复制代码
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                be:8e:d6:40:89:1d:f6:10
        Signature Algorithm: sm2sign-with-sm3
            Issuer: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCA
            Validity
                Not Before: Aug 26 14:36:16 2025 GMT
                Not After : Aug 24 14:36:16 2035 GMT
            Subject: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCA
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub:
                        04:e4:9f:24:e2:be:dc:a0:f9:ee:d6:ff:37:94:e3:
                        15:e1:d4:43:16:3d:2c:6c:13:0e:dc:7f:c3:4e:c8:
                        35:b5:b9:50:0d:f0:73:6e:3d:04:a5:d3:d4:80:70:
                        94:0e:57:bf:1a:0c:fa:14:c8:36:13:9b:64:6f:eb:
                        51:6b:e6:ce:6c
                    ASN1 OID: sm2p256v1
                    NIST CURVE: SM2
            X509v3 extensions:
                X509v3 Basic Constraints: critical
                    CA:TRUE
                X509v3 Key Usage: critical
                    Certificate Sign, CRL Sign
        Signature Algorithm: sm2sign-with-sm3
             30:44:02:20:06:6c:d4:fa:2f:d8:5b:56:14:60:db:37:b7:be:
             f5:90:62:35:e6:8b:b2:83:75:2d:9d:40:e1:a7:6c:72:0d:c0:
             02:20:73:86:6b:7b:bd:15:71:4f:af:75:7a:cc:a0:39:70:e0:
             34:78:77:5f:7a:d2:7b:cb:e9:af:28:5f:de:61:b4:0e

5.2 生成服务器证书(Server Certificate)

5.2.1 生成服务器私钥

bash 复制代码
gmssl ecparam -genkey -name sm2p256v1 -out server.key

5.2.2 生成服务器证书请求(CSR)​

bash 复制代码
gmssl req -new -sm3 -key server.key -out server.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyServer/OU=IT/CN=server.example.com"
  • 注意:CN 为服务器域名(如 server.example.com)。

5.2.3 使用根证书签发服务器证书

bash 复制代码
gmssl x509 -req -days 365 -sm3 -in server.csr -CA root.crt -CAkey root.key -CAcreateserial -out server.crt \
  -extfile <(echo "keyUsage=digitalSignature,keyEncipherment")  # 服务器证书用途
  • 参数说明:
    • -CA-CAkey 指定根证书及私钥;-extfile 定义密钥用途(加密与签名)。

    • -CAcreateserial 生成序列号文件;keyEncipherment 启用加密功能。
      例如:

      bash 复制代码
      Signature ok
      subject=C = CN, ST = Beijing, L = Beijing, O = MyServer, OU = IT, CN = server.example.com
      Getting CA Private Key

5.3 生成客户端证书(Client Certificate)

5.3.1 生成客户端私钥

bash 复制代码
gmssl ecparam -genkey -name sm2p256v1 -out client.key

5.3.2 生成客户端证书请求(CSR)​

bash 复制代码
gmssl req -new -sm3 -key client.key -out client.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyClient/OU=IT/CN=client.example.com"

5.3.3 使用根证书签发客户端证书

bash 复制代码
gmssl x509 -req -days 365 -sm3 -in client.csr -CA root.crt -CAkey root.key -CAcreateserial -out client.crt \
  -extfile <(echo "keyUsage=digitalSignature")  # 客户端证书仅需签名功能

5.4 验证证书链

5.4.1 验证服务器证书

bash 复制代码
gmssl verify -CAfile root.crt server.crt
  • 输出 server.crt: OK 表示验证通过。

5.4.2 验证客户端证书

bash 复制代码
gmssl verify -CAfile root.crt client.crt

5.4.3 查看证书详情

bash 复制代码
gmssl x509 -in server.crt -text -noout | grep "Signature Algorithm"

检查输出是否为 sm2sign-with-sm3,确认国密算法生效

这里请您看下gmssl x509 -in server.crt -text -noout命令的原文:

bash 复制代码
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            e0:da:85:d5:da:1b:1a:01
    Signature Algorithm: sm2sign-with-sm3
        Issuer: C = CN, ST = Beijing, L = Beijing, O = MyRootCA, OU = CA, CN = RootCA
        Validity
            Not Before: Aug 26 14:39:05 2025 GMT
            Not After : Aug 26 14:39:05 2026 GMT
        Subject: C = CN, ST = Beijing, L = Beijing, O = MyServer, OU = IT, CN = server.example.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:14:f0:7f:b2:62:2d:76:81:78:8b:71:d1:c4:0b:
                    f7:e3:d2:b2:a7:ec:7d:9c:b2:51:77:1c:d3:38:8c:
                    a8:3f:de:a7:7b:73:9b:91:5b:1d:20:cc:31:49:de:
                    b1:0e:7d:31:59:21:88:32:9f:e0:d8:a3:ec:6f:70:
                    d4:5f:a3:bb:be
                ASN1 OID: sm2p256v1
                NIST CURVE: SM2
        X509v3 extensions:
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
    Signature Algorithm: sm2sign-with-sm3
         30:45:02:21:00:86:16:08:80:94:90:bd:a7:eb:8c:37:cc:63:
         ce:d8:ed:34:11:7c:3b:8a:ea:79:d2:e9:2c:f7:fb:31:0a:a2:
         87:02:20:75:63:21:ea:3b:20:31:d1:33:27:1a:35:b8:23:cc:
         23:96:d4:09:39:ba:6c:0a:98:af:a9:02:84:45:f1:29:d3

5.5 导出PKCS12格式

5.5.1 服务器证书链

bash 复制代码
gmssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 \
  -name server -CAfile root.crt -passout pass:"密码"

5.5.2 客户端证书链

bash 复制代码
gmssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 \
  -name client -CAfile root.crt -passout pass:"密码"

6. 注意事项

  1. .key.csr.crt.pemSSL/TLS 证书管理中的核心文件,区别如下:
文件类型 核心作用 内容 保密性 格式特点 典型用途
.key 服务器私钥 加密算法的私钥数据(如 RSASM2 绝对私密 通常为 PEM 格式(文本),以 -----BEGIN PRIVATE KEY----- 开头 解密数据、生成签名
.csr 证书签名请求 公钥 + 申请人信息(域名、组织等) + 数字签名 公开 PEM 编码,以 -----BEGIN CERTIFICATE REQUEST----- 开头 CA 申请证书
.crt CA 签发的证书 公钥 + 持有者信息 + CA 签名 + 有效期 公开 支持 PEM(文本)或 DER(二进制),以 -----BEGIN CERTIFICATE----- 开头(PEM 格式) 客户端验证服务器身份
.pem 通用容器(可存储多种加密对象) 证书、私钥、CSR 等(取决于内容标识) 可能含私钥 Base64 编码的文本,以 -----BEGIN XXX----- 开头(如 CERTIFICATEPRIVATE KEY 跨平台传输、合并存储多对象
  1. 文件权限
    私钥权限设为 600,避免未授权访问:

    bash 复制代码
    chmod 600 *.key
  2. 生产环境建议

    • 自签名证书仅用于测试,生产环境需向合规 CA(如 CFCA、JoySSL)申请国密证书。
    • 部署时启用双向认证(服务端验证客户端证书),并配置 CRL(证书吊销列表)
  3. 浏览器兼容性
    主流浏览器(Chrome/Firefox)不支持国密证书,需使用 国密浏览器(如 360安全浏览器)


7. 总结

步骤 核心命令
根证书生成 gmssl req -new -x509 -sm3 -key root.key -out root.crt
服务器证书签发 gmssl x509 -req -sm3 -in server.csr -CA root.crt -CAkey root.key -out server.crt
客户端证书签发 gmssl x509 -req -sm3 -in client.csr -CA root.crt -CAkey root.key -out client.crt
验证证书链 gmssl verify -CAfile root.crt server.crt
导出 PKCS12 gmssl pkcs12 -export -in server.crt -inkey server.key -out server.p12

执行完毕后,将得到完整的国密证书链:

  • 根证书:root.crt
  • 服务器证书:server.crt + server.key
  • 客户端证书:client.crt + client.key
    部署到 Spring Boot 时,将 server.p12client.p12 分别放入服务端与客户端的 resources 目录,并配置 application.yml

资料下载

  1. GmSSL安装过程
  2. 基于GmSSL进行国密SSL证书签发过程

参考资料

http://gmssl.org/docs/quickstart.html

https://github.com/guanzhi/GmSSL/tags

https://blog.csdn.net/markximo/article/details/128124885

相关推荐
一川月白70940 分钟前
Linux--->网络编程(TCP并发服务器构建:[ 多进程、多线程、select ])
linux·运维·服务器·网络编程·io并发服务器
EnigmaCoder1 小时前
【Linux】用户与用户组管理
linux·运维·服务器·数据库
tan77º2 小时前
【项目】分布式Json-RPC框架 - 抽象层与具象层实现
linux·服务器·c++·分布式·tcp/ip·rpc·json
xiaok2 小时前
chown和chmod的使用
linux
mit6.8242 小时前
[pilot智驾系统] 自动驾驶守护进程(selfdrived)
linux·c++·自动驾驶
Lovyk2 小时前
完整实验命令解析:从集群搭建到负载均衡配置(2)
linux·运维·服务器
金色天际线-3 小时前
Linux 系统调优工具详解
linux·运维·服务器
你的电影很有趣3 小时前
lesson47:Linux常用软件使用指南:远程连接、远程拷贝、Vim与Nginx
linux·nginx·vim
缘梦 CC4 小时前
RK3588-NANOPC-T6移植ubuntu+xenomai内核
linux·运维·ubuntu