今天迁移了一个网站到新服务器,用 certbot 安装证书后访问报错 ERR_SSL_PROTOCOL_ERROR

看了下 nginx 的错误日志:

2024/04/16 19:17:14 [crit] 1286606#1286606: *8 SSL_do_handshake() failed (SSL: error:0A0000BA:SSL routines::bad cipher) while SSL handshaking, client: xxx.xxx.xxx.xxx, server: 0.0.0.0:443

奇怪的是,其他网站都是正常的。

检查配置,发现迁移网站的 nginx 配置跟其他网站的区别有一个:

ssl_prefer_server_ciphers off;

off 改为 on 后 service nginx reload,问题解决。

需要注意的是,由于 ssl 是 certbot 自动配置的,所以这个配置项在 /etc/letsencrypt/options-ssl-nginx.conf 这个文件里。

PS: 如果不在这个文件夹里,可以参见你的站点配置文件 include 了哪个配置文件。


关于 nginx ssl_prefer_server_ciphers 配置项

在 Nginx 配置中,ssl_prefer_server_ciphers 是一个用于SSL/TLS设置的指令,它决定了在SSL/TLS握手期间使用的加密套件优先顺序。

具体而言,当 ssl_prefer_server_ciphers 设置为on时,Nginx会优先使用服务器端提供的加密套件列表。这意味着在SSL/TLS握手期间,Nginx会选择服务器支持的最强大的加密套件。这通常是推荐的做法,因为服务器端可以控制使用的加密套件,以确保使用最安全的配置。

而当ssl_prefer_server_ciphers设置为off时,Nginx会优先使用客户端提供的加密套件列表。这样做可能会使您的服务器更易于受到中间人攻击,因为它允许客户端选择加密套件,而不一定是最安全的选项。

通常情况下,建议将 ssl_prefer_server_ciphers 设置为 on,以确保服务器端优先使用最安全的加密套件,从而提高通信的安全性。


标签: nginx, ssl, certbot