前言
今天在给一个站点配置 HTTPS 证书的时候,遇到了一个问题,写此文章记录一下解决过程。
环境
Ubuntu 22.04
Nginx 1.18
过程
今天给一个站点申请了 HTTPS 证书,然后在 Nginx 中进行配置,Nginx 的 SSL 配置如下:
listen 443;
ssl_certificate /etc/nginx/ssl/mysite.cer;
ssl_certificate_key /etc/nginx/ssl/mysite.key;
配置完后,访问网站报错“ERR_SSL_PROTOCOL_ERROR
”,如下图:
凡是通过https访问的请求,在 Nginx 的 access.log 中都出现了很多\x
开头的乱码字符:
在 shell 环境中使用curl命令访问:curl 'https://www.mysite.com/'
,会报错:
curl: (35) error:0A00010B:SSL routines::wrong version number
一开始以为是证书有问题,检查了一番没有头绪,最后发现是 Nginx 的配置写错了:
listen 443 ssl;
#listen [::]:443 ssl;
ssl_certificate /etc/nginx/ssl/mysite.cer;
ssl_certificate_key /etc/nginx/ssl/mysite.key;
第一行listen 443 ssl
的 ssl
漏写了,后果就是,Nginx 虽然监听了443端口,但是并没有在此端口上启用SSL模块,也就是说,工作模式是跟80端口一样的,所以浏览器发送过来的加密数据Nginx无法识别,最终导致在 access.log 中看到了乱码的数据。
其它
-
在旧版的 Nginx 中,开启SSL模块有一个专属指令,如下图所示:
但这个指令在新版的 Nginx 中已经被废弃。 -
细心的人可能还会发现有一行注释的配置:
listen [::]:443 ssl
这句配置的意思是:在 ipv6 地址上监听443端口,而listen 443 ssl
只在 ipv4 地址上监听,如果需要支持ipv6,可以将注释去掉。