从 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
研究了很长时间之后,唯一能解决这个问题的是:
- 将所有NGINX 中的块
ssl_session_tickets off;
移出server {...}
- 在 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 {..}
块中删除的建议为我解决了这个问题。