为实现国密环境下的 HTTP 自动跳转 HTTPS,你需要在 Nginx 中配置两个核心任务:一是构建支持国密算法的 Nginx 环境,二是在此基础上正确配置重定向规则。这两种跳转方案各有优劣,我在下面展开详细说明。
一、环境准备:构建支持国密算法的 Nginx
这是最基础但最关键的一步。Nginx 官方版本默认不支持国密,需要通过以下两种方式之一来构建:
方案一:使用预编译的“国密版”Nginx
如阿里云、腾讯云或社区维护的 `nginx-gm` 分支。这是最快捷的方法,省去了编译过程,通常直接安装即可使用。
方案二:自行编译(推荐用于生产环境)
此方法虽然稍复杂,但能确保性能稳定,且对国密算法的支持更可控。核心步骤是用支持国密的 `GmSSL` 替换 `OpenSSL`,并重新编译 Nginx。
1. 下载并编译 GmSSL:下载最新的稳定版(如 v3.x 系列),编译时加入 `shared` 参数以生成动态链接库。
2. 编译 Nginx 并关联 GmSSL:下载 Nginx 源码,在 `configure` 阶段通过 `--with-openssl=` 参数指定刚编译好的 `GmSSL` 源码路径。
3. 替换并验证:编译安装后,使用 `nginx -V` 命令检查。输出中应显示你指定的 GmSSL 信息,例如,可看到类似 `built with OpenSSL 3.1.1-gm` 的字样。
完成上述步骤后,便拥有了一个支持国密算法的 Nginx 基础环境。
二、核心配置:HTTPS 自动跳转的两种方案
有两种主流的配置方法,推荐使用更简洁高效的 `return` 方法,`rewrite` 方法则适用于更复杂的重定向规则。
方案一:使用 `return` 指令 (推荐)
这是更高效、简洁的推荐写法。
nginx
server {
listen 80;
server_name your-domain.com; # 替换为你的域名
# 将所有 HTTP 请求永久重定向到 HTTPS
return 301 https://$host$request_uri;
}
指令解析:
`listen 80;`:监听标准的 HTTP 端口。
`return 301`:返回 HTTP 状态码 301(永久重定向),告诉浏览器该资源已永久迁移到新地址。
`https://$host$request_uri`:指定了重定向的目标地址。其中,`$host` 代表原始请求的域名,`$request_uri` 代表原始请求的 URI 路径和参数。
方案二:使用 `rewrite` 指令 (备选)
此方法在功能上与 `return` 等价,但传统上常用于更复杂的 URL 重写场景。
nginx
server {
listen 80;
server_name your-domain.com; # 替换为你的域名
rewrite ^(.*)$ https://$host$1 permanent;
}
指令解析:
`rewrite ^(.*)$`:使用正则表达式捕获整个请求路径。
`https://$host$1`:在 HTTPS 的目标地址后,通过 `$1` 将捕获到的请求路径附加回去。
`permanent`:等同于 `return 301`,执行一个永久重定向。
三、国密版 Nginx `server` 配置示例
以下是完整的国密 Nginx 配置示例,它同时包含处理 HTTP 跳转的 `server` 块和提供国密 HTTPS 服务的 `server` 块。请注意将**配置示例中的所有路径(如 `/path/to/...`)和占位符(如 `your-domain.com`),替换为你自己的实际信息**。
nginx
# 处理所有 HTTP 请求的 server 块
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
# 处理国密 HTTPS 请求的 server 块
server {
# 监听端口
listen 443 ssl http2;
server_name your-domain.com;
# 国密核心配置:证书与私钥
ssl_certificate /path/to/your-sm2-sign-cert.pem; # SM2 签名证书
ssl_certificate_key /path/to/your-sm2-sign-cert.key; # SM2 签名证书私钥
# 如果使用加密证书,也需要配置
ssl_certificate /path/to/your-sm2-enc-cert.pem; # SM2 加密证书
ssl_certificate_key /path/to/your-sm2-enc-cert.key; # SM2 加密证书私钥
# 国密核心配置:协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3; # 建议同时启用 TLS 1.2 和 1.3
ssl_ciphers ECDHE-SM4-CBC-SM3:ECDHE-SM4-GCM-SM3; # 指定国密密码套件
ssl_ecdh_curve SM2; # 显式指定 ECDH 曲线为 SM2
# ... 网站的根目录、日志等其他配置
}
四、常见避坑指南
避免重定向循环:务必确保重定向规则只写在监听 80 端口的 HTTP `server` 块中,不要在 443 端口的 HTTPS `server` 块内添加任何重定向到自身的规则。
注意状态码的选择:SEO 优化通常用 301(永久重定向),而在调试或 A/B 测试等临时场景下,使用 302(临时重定向)更安全。
重视浏览器兼容性:国密 SM2 证书不会被 Chrome、Firefox 等国际主流浏览器原生信任,必须在支持国密的浏览器(如 360 安全浏览器企业版、奇安信可信浏览器)中才能获得完整的“绿色锁”安全体验。
若使用双证书方案:部分国密部署会采用“SM2/RSA 双证书”方案以保证兼容性,这意味着需要对 RSA 和 ECC 加密套件也进行相应配置。
重视私钥安全:请务必将私钥文件的权限设置为 `600`,并确保其目录不在 Web 公开访问路径下。
开启 HSTS 加强安全:在完成重定向后,强烈建议在 HTTPS `server` 块中添加 `add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;` 头部,以强制浏览器在未来指定时间内,始终通过 HTTPS 访问你的网站,有效防范SSL剥离攻击。通常结合 301 重定向一起使用,能最大程度地提升安全性。
五、下一步步骤详解
1. 申请并获取国密SM2证书:从国内CA(如CFCA、上海CA等)获取证书文件(`.pem` 或 `.crt`)和私钥文件(`.key`)。
2. 上传证书与修改配置:将证书文件上传到服务器,并根据**文章内配置示例**修改 Nginx 配置文件。
3. 配置并启用自动跳转:根据你选择的方案,将**文章内跳转示例**中的 `return` 或 `rewrite` 规则添加到配置文件。
4. 测试与加载配置:使用 `nginx -t` 测试配置是否正确。若无报错,则执行 `nginx -s reload` 或重启 Nginx 服务使之生效。
如果编译时遇到动态库链接报错,或配置后重定向出现了循环,可以告诉我具体的报错信息,我来帮你进一步排查。