linux

Nginx: SSL_do_handshake() failed… and that’s OK!

背景:前几天查看网站错误日志,发现有以下错误

2022/08/01 22:35:21 [crit] 388149#388149: *64975 SSL_do_handshake() failed (SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share) while SSL handshaking, client: 154.89.5.125, server: 0.0.0.0:443

从报错日志中不难看出跟ssl相关,那么就可以直接定位到nginx配置中ssl相关参数,进一步确认跟ssl_protocols相关。

本质上,此错误可能意味着以下两种情况之一:

  • 客户端使用的是非常旧的设备,因此它无法使用您nginx定义的ssl协议
  • 客户端故意尝试使用较旧的不安全SSL协议

无论哪种情况,您都不应该担心,尽管您可能想降低 Web 服务器的安全性以支持旧协议,例如 TLS v1.0 和 TLS v1.1 但要知道这是一个坏主意。为了一些过时的客户,会影响较多用户的安全。

解决办法如下:

情况一:

  • 在Ubuntu 20.04 中, OpenSSL升级到了1.1.1f, TLS默认最低支持1.2。
  • 虽然nginx中配置支持ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ,但是当请求为TLSv1 TLSv1.1 时却不生效,因为默认openssl最低支持TLSv1.2


修改openssl配置文件,设置支持最低为TLSv1

vim /etc/ssl/openssl.cnf

#以下配置在顶部添加
openssl_conf = default_conf              
#以下配置在底部添加
[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=1

情况二:

  • 在Ubuntu 22.04 中, OpenSSL升级到了3.0.x, TLS默认最低支持1.2。
  • 虽然nginx中配置支持ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ,但是当请求为TLSv1 TLSv1.1 时却不生效,因为默认openssl最低支持TLSv1.2 3.下图是通过抓包得到的信息

修改openssl配置文件,设置支持最低为TLSv1

vim /etc/ssl/openssl.cnf

[system_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT:@SECLEVEL=0

重启服务器

reboot

测试

nmap  --script  ssl-enum-ciphers  -p 443  127.0.0.1

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注