Nginx配置https证书遇到的一个问题

前言

今天在给一个站点配置 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 sslssl 漏写了,后果就是,Nginx 虽然监听了443端口,但是并没有在此端口上启用SSL模块,也就是说,工作模式是跟80端口一样的,所以浏览器发送过来的加密数据Nginx无法识别,最终导致在 access.log 中看到了乱码的数据。

其它

  1. 在旧版的 Nginx 中,开启SSL模块有一个专属指令,如下图所示:

    但这个指令在新版的 Nginx 中已经被废弃。

  2. 细心的人可能还会发现有一行注释的配置:listen [::]:443 ssl
    这句配置的意思是:在 ipv6 地址上监听443端口,而listen 443 ssl只在 ipv4 地址上监听,如果需要支持ipv6,可以将注释去掉。

本文链接:https://my.lmcjl.com/post/14060.html

展开阅读全文

4 评论

留下您的评论.