[实践OK]Nginx开Tls1.3时遇到还是Tls1.2的原因排查,之 443端口default没有采用TLS1.3所导致的排查方法。

jack 2026-11-7 21:29 大 | 中 | 小
直接用curl访问一个不存在的IP,看看默认是哪个域名,通过域名进入Nginx里面把对应的默认的域名配置的TLS1.2给去掉即可,如下面这个得到t.boosh.com.cn,发现它并不对外开放443,然后:

找到 443 的默认虚拟主机
在 123.57.232.131 上执行,使用正在运行的 OpenResty 对应的 nginx 命令:
nginx -T 2>&1 |
  grep -nE '^# configuration file|^[[:space:]]*(include|listen|server_name|ssl_protocols|ssl_certificate|proxy_pass)[[:space:]]'

看同一个监听地址的 443 配置。有 default_server 就改对应的 server 块,否则看配置解析顺序中第一个监听该地址 443 的 server 块。结合你前面遇到的情况,先在这个 443 默认块里启用 TLS 1.3,同时保留 TLS 1.2:
ssl_protocols TLSv1.2 TLSv1.3;

下面命令出现第一个443的域名就是:chat.jackxiang.com ,对它进行修改即可!!!

#nginx -T 2>&1 |
>   grep -nE '^# configuration file|^[[:space:]]*(include|listen|server_name|ssl_protocols|ssl_certificate|proxy_pass)[[:space:]]'
3:# configuration file /usr/local/openresty/nginx/conf/nginx.conf:
21:    include                      mime.types;
77:    include vhosts/*.conf;
78:    include vhosts/traefik.jackxiang.com/*.conf;
81:# configuration file /usr/local/openresty/nginx/conf/mime.types:
182:# configuration file /usr/local/openresty/nginx/conf/vhosts/default.conf:
184:    listen 80;
185:    server_name 127.0.0.1;
200:        include fastcgi_params;
208:        include fastcgi_params;
226:# configuration file /usr/local/openresty/nginx/conf/fastcgi_params:
253:# configuration file /usr/local/openresty/nginx/conf/vhosts/traefik.jackxiang.com/bin.jackxiang.com.conf:
256:    listen       80;
257:    server_name  bin.jackxiang.com;
259:        proxy_pass http://10.10.0.237/;
266:# configuration file /usr/local/openresty/nginx/conf/vhosts/traefik.jackxiang.com/boosh.com.cn.conf:
269:    listen       80;
270:    server_name  boosh.com.cn www.boosh.com.cn;
287:    listen       80;
288:    server_name  ipv4.boosh.com.cn;
299:# configuration file /usr/local/openresty/nginx/conf/vhosts/traefik.jackxiang.com/chat.jackxiang.com.conf:
301:        listen       80;
302:        server_name  chat.jackxiang.com;
307:        listen 443 ssl;
308:        server_name  chat.jackxiang.com;
309:        ssl_certificate ssl/ssl.traefik.jackxiang.com/chat.jackxiang.com_bundle.crt;
312:        ssl_protocols TLSv1.2 TLSv1.3;
326:        proxy_pass http://10.10.0.237/;


nginx-default-https-vhost (1).md

![](https://jackxiang.com/attachment.php?fid=1381){width=500px}

可以。**要看 `10.10.0.1:443` 的默认 HTTPS 站点,先用 `openssl s_client -noservername`。** 这会在握手时省略 SNI,让 OpenResty 返回该监听地址的默认证书。

```bash
openssl s_client -connect 10.10.0.1:443 \
  -noservername -showcerts </dev/null 2>/dev/null |
  openssl x509 -noout -subject -ext subjectAltName -fingerprint -sha256
```

如果证书只对应 `chat.jackxiang.com`,就能从访问结果识别默认站点。**如果几个站点共用同一张通配符证书,证书只能告诉你入口用了哪张证书。** 这时可以再发一个 `Host` 不匹配任何站点的 HTTP 请求,看看默认站点返回的响应或写入哪份访问日志:

```bash
curl --noproxy '*' -vk \
  -H 'Host: no-such-vhost.invalid' \
  https://10.10.0.1/
```

这里 URL 用 IP,`Host` 用一个不存在的域名。反过来,如果写 `-H 'Host: jackxiang.com'`,TLS 握手之后,HTTP 请求仍可能被路由到 `jackxiang.com`。如果用 `curl --resolve jackxiang.com:443:10.10.0.1 https://jackxiang.com/`,curl 会按域名发送 SNI 和 `Host`,适合测指定站点。

如果几个站点的证书和响应都一样,**用 `nginx -T` 核对配置最直接**。看同一监听地址是否有显式的 `default_server`,没有就按实际配置加载顺序找第一个 `listen 443 ssl;` 的 `server` 块。你之前贴的输出里,`chat.jackxiang.com` 的 443 块排在最前面,而且修改它的协议设置后,`jackxiang.com` 的 TLS 1.3 握手立即恢复。这两条证据已经能确认你当时命中的默认站点。

作者:jack@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/13641/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jack 编辑于2026-11-7 21:53
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]