当 NGINX 配置中的一个服务器 {..} 块被删除时,浏览器会报告 SSL 错误

当 NGINX 配置中的一个服务器 {..} 块被删除时,浏览器会报告 SSL 错误

从 NGINX 配置中删除一个server {..}块并保留另外两个server {..}块后,浏览器上开始出现奇怪的 SSL 错误:

  • Chrome 报告错误 ERR_SSL_PROTOCOL_ERROR

  • Firefox 报告 SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET

  • Curl 报告 gnutls_handshake() 失败:收到了意外的 TLS 数据包

由于某种奇怪的原因,这些浏览器错误发生在删除其中一个server {..}块并重新启动 NGINX 之后。nginx -t重新启动之前运行显示 NGINX 配置有效且没有问题。然而,重新启动引发了这些问题。

我正在使用 Let's Encrypt 证书。

nginx -V

OUTPUT:
nginx version: nginx/1.14.0
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_mp4_module --with-http_perl_module --with-http_random_index_module --with-http_secure_link_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-threads --add-module=/build/nginx-1.14.0/debian/modules/headers-more-nginx-module --add-module=/build/nginx-1.14.0/debian/modules/nginx-auth-pam --add-module=/build/nginx-1.14.0/debian/modules/nginx-cache-purge --add-module=/build/nginx-1.14.0/debian/modules/nginx-dav-ext-module --add-module=/build/nginx-1.14.0/debian/modules/nginx-development-kit --add-module=/build/nginx-1.14.0/debian/modules/nginx-echo --add-module=/build/nginx-1.14.0/debian/modules/ngx-fancyindex --add-module=/build/nginx-1.14.0/debian/modules/nchan --add-module=/build/nginx-1.14.0/debian/modules/nginx-lua --add-module=/build/nginx-1.14.0/debian/modules/nginx-upload-progress --add-module=/build/nginx-1.14.0/debian/modules/nginx-upstream-fair --add-module=/build/nginx-1.14.0/debian/modules/ngx_http_substitutions_filter_module --add-module=/build/nginx-1.14.0/debian/modules/passenger/src/nginx_module

答案1

研究了很长时间之后,唯一能解决这个问题的是:

  1. 将所有NGINX 中的块ssl_session_tickets off;移出server {...}
  2. 在 nginx 块内添加一行http {..}
http {
...
    ssl_session_tickets off;
...
}

答案这里帮助很大:

如果所有启用 ssl 的 server{} 块的 ssl_session_tokens 设置不同,ssl_session_tokens off 会中断。因此,如果您有 2 个服务器配置,并且在其中一个服务器配置中将 ssl_server_tokens 设置为 on(这是默认值,因此即使您省略它也会计算在内),而在另一个服务器配置中将其设置为 off,则在某些浏览器中,设置为 off 的服务器配置会中断。除非您有多个 http{} 块,否则解决此问题的最简单方法是在 http{} 块中将其设置为 off。我还没有测试过您是否可以在不同的 http{} 块中使用不同的设置,因为我不需要设置多个 http{} 块。

虽然可能不是完全相同的情况,但移动ssl_session_tickets off;http {..}块并将它们从所有server {..}块中删除的建议为我解决了这个问题。

相关内容