Skip to content

GmSSL/nginx-gmssl

nginx-gmssl

nginx-gmssl 是基于 Nginx 1.30.2 的 GmSSL 适配版本。这个项目将 Nginx 原有的 OpenSSL 后端替换为 GmSSL TLS 接口,使 HTTP SSL 模块可以使用国密 TLS 能力提供 HTTPS 服务。

当前实现面向服务端 HTTPS 场景,支持把一个 server 配置为 TLCP、TLS 1.2 或 TLS 1.3 三种协议之一。由于 GmSSL 当前服务端接口尚不支持在同一个连接中同时协商 TLCP、TLS 1.2、TLS 1.3,本项目要求每个 serverssl_protocols 只启用一个协议。

原始 Nginx 项目说明保留在 README

支持的协议和套件

当前 GmSSL 后端默认配置如下:

Nginx 配置 GmSSL 协议 默认套件
ssl_protocols TLCP; TLCP TLS_ECDHE_SM4_CBC_SM3, TLS_ECC_SM4_CBC_SM3
ssl_protocols TLSv1.2; TLS 1.2 TLS_ECDHE_SM4_CBC_SM3
ssl_protocols TLSv1.3; TLS 1.3 TLS_SM4_GCM_SM3

曲线默认使用 sm2p256v1,签名算法默认使用 sm2sig_sm3。当前后端主要覆盖静态文件服务和 HTTP 反向代理入口的 HTTPS 连接;SNI、ALPN、客户端证书验证、会话恢复、OCSP Stapling 等 OpenSSL 生态中的高级能力尚未完整映射到 GmSSL。

编译

先安装或构建 GmSSL,并确保头文件和动态库可被 Nginx 找到。例如 GmSSL 安装到 /usr/local

./configure --with-http_ssl_module --with-gmssl=/usr/local
make -j

如果运行时系统找不到 libgmssl,可以在配置时增加 rpath:

./configure --with-http_ssl_module --with-gmssl=/usr/local \
    --with-ld-opt="-Wl,-rpath,/usr/local/lib"
make -j

启动时会检查编译期 GMSSL_VERSION_STR 和运行时 gmssl_version_str() 是否一致。如果 Nginx 链接到的 GmSSL 动态库与编译时使用的头文件版本不一致,Nginx 会报错并停止启动。

安全注意事项

  • 请使用可信来源构建或安装 GmSSL,并保证运行时加载的 libgmssl 与编译时头文件版本一致。
  • TLCP 需要签名证书和加密证书两套 SM2 证书/私钥。TLS 1.2 和 TLS 1.3 示例使用 SM2 签名证书链和对应私钥。
  • 私钥建议使用口令加密,并通过 ssl_password_file 指定口令文件。生产环境中应限制证书、私钥、口令文件权限。
  • 当前后端不支持在同一个 server 中同时启用多个 TLS/TLCP 协议版本;请按端口或虚拟主机拆分。
  • 本项目仍属于适配实现,部署到生产环境前应结合业务场景进行互操作性、错误处理、日志和安全测试。

SSL 和证书配置

TLS 1.2 示例:

server {
    listen 8443 ssl;
    server_name localhost;

    ssl_protocols TLSv1.2;
    ssl_certificate /path/to/sm2certs.pem;
    ssl_certificate_key /path/to/sm2signkey.pem;
    ssl_password_file /path/to/pass.txt;

    root /path/to/html;
}

TLS 1.3 示例:

server {
    listen 8444 ssl;
    server_name localhost;

    ssl_protocols TLSv1.3;
    ssl_certificate /path/to/sm2certs.pem;
    ssl_certificate_key /path/to/sm2signkey.pem;
    ssl_password_file /path/to/pass.txt;

    root /path/to/html;
}

TLCP 示例:

server {
    listen 8445 ssl;
    server_name localhost;

    ssl_protocols TLCP;
    ssl_certificate /path/to/double_certs.pem;
    ssl_certificate_key /path/to/double_keys.pem;
    ssl_password_file /path/to/pass.txt;

    root /path/to/html;
}

TLCP 的 double_certs.pem 通常按签名证书、加密证书、CA 证书链顺序拼接;double_keys.pem 通常按签名私钥、加密私钥顺序拼接,并使用相同口令。

反向代理入口也可以使用 GmSSL HTTPS:

server {
    listen 8446 ssl;
    server_name localhost;

    ssl_protocols TLSv1.2;
    ssl_certificate /path/to/sm2certs.pem;
    ssl_certificate_key /path/to/sm2signkey.pem;
    ssl_password_file /path/to/pass.txt;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

仓库中的 gmssl-tests/ 提供了本地测试配置:

  • gmssl-tests/tls12.conf
  • gmssl-tests/tls13.conf
  • gmssl-tests/tlcp.conf
  • gmssl-tests/proxy_tls12.conf

这些配置包含本机路径,换到其他机器时需要按实际 GmSSL 构建目录和仓库路径调整证书路径、口令文件路径和 root 路径。

使用 gmssl 命令行测试

启动 TLS 1.2 测试服务:

objs/nginx -p "$PWD/gmssl-tests/runtime" -c "$PWD/gmssl-tests/tls12.conf"

使用 GmSSL TLS 1.2 客户端访问:

printf 'GET / HTTP/1.0\r\nHost: localhost\r\n\r\n' | \
gmssl tls12_client \
    -host 127.0.0.1 -port 8443 \
    -cacert /path/to/sm2rootcacert.pem \
    -cipher_suite TLS_ECDHE_SM4_CBC_SM3 \
    -supported_group sm2p256v1 \
    -sig_alg sm2sig_sm3

TLS 1.3:

printf 'GET / HTTP/1.0\r\nHost: localhost\r\n\r\n' | \
gmssl tls13_client \
    -host 127.0.0.1 -port 8444 \
    -cacert /path/to/sm2rootcacert.pem \
    -cipher_suite TLS_SM4_GCM_SM3 \
    -supported_group sm2p256v1 \
    -sig_alg sm2sig_sm3

TLCP:

gmssl tlcp_client \
    -host 127.0.0.1 -port 8445 \
    -cacert gmssl-tests/tlcp-certs/rootcacert.pem \
    -cipher_suite TLS_ECC_SM4_CBC_SM3 \
    -get /

反向代理测试:

objs/nginx -p "$PWD/gmssl-tests/runtime" -c "$PWD/gmssl-tests/proxy_tls12.conf"

printf 'GET / HTTP/1.0\r\nHost: localhost\r\n\r\n' | \
gmssl tls12_client \
    -host 127.0.0.1 -port 8446 \
    -cacert /path/to/sm2rootcacert.pem \
    -cipher_suite TLS_ECDHE_SM4_CBC_SM3 \
    -supported_group sm2p256v1 \
    -sig_alg sm2sig_sm3

预期可以看到 HTTP 响应头和测试页面内容。

许可证

本项目基于 Nginx 源码,遵循原 Nginx 许可证。GmSSL 遵循其自身项目许可证。

About

Nginx with GmSSL backend

Resources

License

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors