Nginx 反代 SSL_do_handshake 问题解决思路

💡 原文中文,约2300字,阅读约需6分钟。
📝

内容提要

本文讨论了Nginx反向代理中的502 Bad Gateway错误,主要原因是SSL握手失败,通常是由于未启用SNI导致SSL证书无法正确识别。解决方法是在Nginx配置中添加`proxy_ssl_name`和`proxy_ssl_server_name`参数,以确保SSL连接的正确性。

🔎

延伸解读

SNI 缺失为何导致 502

文章指出,当上游服务器在同一 IP 上托管多个 HTTPS 站点时,Nginx 反代默认不发送 SNI,上游无法确定该返回哪张证书,握手因此失败并返回 502。错误日志中的 wrong version number 正是这一问题的典型表现。理解这一点有助于快速区分是证书本身问题还是 SNI 未启用。

配置修复的关键参数

解决方法是在 location 块中加入 proxy_ssl_name 和 proxy_ssl_server_name on。前者指定要反代的目标域名,后者启用 SNI 扩展。文章强调需将示例中的 7bu.top 替换为实际反代的域名,否则 SNI 信息仍不正确,握手可能继续失败。

CDN 场景的类似风险

文章提到,类似问题偶尔也会出现在使用 CDN 时,多因 CDN 配置未设置 SNI 导致。此时可通过设置回源 HOST 来解决,并以 99CDN 面板为例说明。这提示读者在排查 502 时,不应只关注 Nginx 本身,CDN 回源配置也可能引入相同症状。

❓

Q&A

Nginx 反代时出现 502 Bad Gateway 错误的主要原因是什么?

主要原因是 SSL 握手失败,通常是由于未启用 SNI 导致 SSL 证书无法正确识别。

如何解决 Nginx 反代中的 SSL 握手失败问题?

在 Nginx 配置中添加 `proxy_ssl_name` 和 `proxy_ssl_server_name` 参数。

什么是 SNI,它在 SSL 握手中有什么作用?

SNI 是 TLS 协议的扩展,确保客户端能够访问正确的 SSL 证书,特别是在多个域名共享同一 IP 地址时。

在 Nginx 配置中如何正确设置反代的域名?

在配置文件的 location 块中,将 `proxy_ssl_name` 设置为实际反代的域名,并启用 `proxy_ssl_server_name`。

使用 CDN 时可能出现哪些与 SSL 握手相关的问题?

通常是由于配置 CDN 时未设置 SNI 导致的 SSL 握手失败。

Nginx 反代的配置示例是什么样的?

配置示例包括设置 `proxy_pass`、`proxy_set_header` 和 SSL 相关参数,如 `proxy_ssl_name` 和 `proxy_ssl_server_name`。

🏷️

标签

➡️

继续阅读