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日志一样会这样输出。具体情况还待深入研究。