封尘网

让学习成为一种习惯!

ssl_protocols协议导致网站和小程序无法正常提供服务

nginx在错误日志里会一直输出以下信息

2020/10/16 10:07:41 [crit] 16203#0: *4672 SSL_read() failed (SSL: error:14095126:SSL routines:ssl3_read_n:unexpected eof while reading) while keepalive, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443

 

事故原因:

由于业务需要把一个项目迁移回来,nginx 上的配置也直接就搬了回来放到相对个一点的版本上。由于Nginx -t 检查配置文件通过,直接reload后服务就跑起来了。

但是在浏览器里访问项目时发现异常提示,"你与网站建立的连接不安全"

相应的服务在小程序里访问时提示:"request:fail 发生了SSL错误,无法建立与该服务器的安全连接。"

 

之前在迁移之前,这套配置文件在之前的系统中是正常的,一迁移到当前机器就出现问题了。刚开始以为是Nginx编译时的openssl版本问题所致,然后使用新的openssl 重新编译nginx后问题依旧(参考上面日志信息),甚至无法访问服务。

 

根本原因:

由于这个环境中有多个Nginx配置文件,多个域名都使用ssl协议,但是之前的配置中带有旧的TLSv1.0协议,而上面刚迁移过来的配置中定义使用的是TLSv1.2协议。因为小程序也要求在TLSv1.2以上,之前未迁移回来时是单独一台机器的,现在并在一起了就有了老旧协议的问题。因为两个配置中版本不统一,导致ngixn无法处理,就会出现上面的异常问题。

 

解决方法

统一修改当前机器上所有配置ssl_protocols。前提是Nginx编译时是支持TLSv1.2或以上

    ssl_protocols   TLSv1.2 TLSv1.3;
    add_header Strict-Transport-Security "max-age=63072000" always;

 

检查openssl是否支持TLSv1.2

openssl ciphers -v | awk '{print $2}' | sort | uniq

 

命令行检查网站是否支持TLSv1.2

成功的可以看到这么一行信息:* SSL connection using XXXXX

curl -I -v --tlsv1.2 --tls-max 1.2 https://www.58jb.com/

 

说明

根据问题发现在网上https://github.com/openssl/openssl/issues/11381 同样存在这样的情况,哪怕是已经把上面的问题解决了,但是使用openssl1.1.1e重新编译后的Nginx日志一样会这样输出。具体情况还待深入研究。