Nginx实现老旧与现代终端“完美适配”的核心是双算法证书+差异化TLS策略,推荐SNI分流方案:为旧终端(如Android 4.4、iOS 9)配置独立子域名(m.example.com)绑定RSA证书并启用TLSv1.1/TLSv1.2及兼容套件;为主站(www.example.com)配置ECC证书、TLSv1.2/TLSv1.3及强加密套件。

要在 Nginx 中实现对老旧终端(如 Android 4.4、iOS 9)和现代终端(Chrome 120+、Safari 17+、Edge 120+)的“完美适配”,核心不是单证书,而是双算法证书 + 差异化 TLS 协议与密码套件策略。Nginx 本身不原生支持同一 server 块内动态切换证书算法(如 SM2 和 RSA),但可通过两种成熟路径达成目标:一是基于 SNI 的多 server 块分流(推荐),二是使用国密版 Nginx 配合 SM2/RSA 双证书(需定制编译或专用发行版)。
方案一:SNI 分流 —— 用不同域名承载不同证书与策略
这是最稳定、兼容性最好、无需修改 Nginx 源码的方式,适用于绝大多数生产环境。
- 为老旧终端单独配置一个子域名(如 m.example.com),绑定传统 RSA 证书,并启用 TLSv1.1/TLSv1.2 与宽泛兼容的 cipher suite
- 为主站或现代终端域名(如 www.example.com)配置高安全性策略:TLSv1.2/TLSv1.3 + 强加密套件(如
ECDHE-ECDSA-AES256-GCM-SHA384) - 客户端根据自身 UA 或 DNS 解析习惯访问对应域名;也可在前端 JS 或后端做轻量 UA 检测后 302 跳转(非必须,但可提升体验)
示例配置片段:
# 移动端兼容模式(旧设备友好)
server {
listen 443 ssl http2;
server_name m.example.com;
ssl_certificate /etc/ssl/certs/m.example.com_rsa.crt;
ssl_certificate_key /etc/ssl/private/m.example.com_rsa.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / { proxy_pass http://mobile_backend; }
}
<h1>主站(现代终端优先)</h1><p>server {
listen 443 ssl http2;
server_name www.example.com example.com;
ssl_certificate /etc/ssl/certs/www.example.com_ecdsa.crt;
ssl_certificate_key /etc/ssl/private/www.example.com_ecdsa.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;
ssl_ecdh_curve secp384r1;
location / { proxy_pass <a href="https://www.php.cn/link/ae77ae50016d01f6c9d504e8194b9615">https://www.php.cn/link/ae77ae50016d01f6c9d504e8194b9615</a>; }
}</p>方案二:国密版 Nginx + SM2/RSA 双证书(国产合规场景)
若需满足等保、金融信创或政务云要求,且终端可控(如预装红莲花/密信浏览器),可部署国密增强版 Nginx(如 Tengine 国密分支或 nginx-gm),并配置双证书链。
- 需同时提供两套证书文件:
example.com_sm2_sign.pem(签名证书) +example.com_sm2_sign.key,以及对应的 RSA 证书对 - 国密版 Nginx 支持
ssl_certificate和ssl_certificate_by_lua*(部分版本)或通过ssl_trusted_certificate辅助协商,但更常见的是依赖客户端 SNI 扩展自动选择 - 实际部署中,仍建议搭配两个 server 块或利用
map指令按$ssl_server_name或$http_user_agent做条件加载(高级用法,需谨慎测试)
关键注意事项
无论采用哪种路径,以下细节决定成败:
-
证书路径权限必须正确:私钥文件权限应为
600,属主为nginx或www-data,否则启动报错 -
不要忽略 HTTP → HTTPS 重定向:每个 server 块都应配
listen 80并 301 跳转,避免明文暴露 -
验证 SNI 是否生效:用
openssl s_client -connect m.example.com:443 -servername m.example.com查看返回的证书是否匹配预期 -
移动端 UA 判断不可靠:纯靠
$http_user_agent匹配再动态改ssl_certificate在标准 Nginx 中无法实现(指令上下文不支持运行时变量),切勿强行 hack


















