记录一次1Panel配置SSL导致的面板访问失败

问题描述

今天在使用1Panel配置网站的时候,给域名上传了SSL证书、开启了https访问。

然后面板就进不去了,浏览器报告连接不安全。

在这里插入图片描述

猜测导致问题的原因是,OpenResty把所有访问该域名的请求都重定向到了https。(最后研究发现该猜测错误)

发生这件事有以下几个条件:

  • 正在配置的网站域名和面板域名相同,都是xxx.example.com。
  • 面板先前没有开启HTTPS访问。
  • 配置HTTPS时选择了HTTP自动访问HTTPS(如图)
  • 配置完成后对https://xxx.example.com进行了访问

在这里插入图片描述

经过研究发现,其实这是浏览器HSTS(HTTP Strict Transport Security)导致的问题。
直接原因是1Panel在OpenResty配置文件中为我们默认添加了如下的响应头:

add_header Strict-Transport-Security "max-age=31536000"; 

我们在首次访问http://xxx.example.com以后,OpenResty会通过如下指令重定向到https://xxx.example.com/

if ($scheme = http) {
    return 301 https://$host$request_uri;
}

301重定向访问https后,浏览器就会收到上述的Strict-Transport-Security Header,并记录下来,有效期是一年。

下次使用HTTP协议访问xxx.example.com域名,浏览器就会自动进行307重定向到HTTPS。而前面提到,面板没有开启HTTPS,导致面板无法进入。

你甘心让自己的面板持续一年无法访问吗?如果不是的话,就看看下面的修复步骤吧😂

修复步骤

1、移除该域名的HSTS记录

对于Chrome,可以访问chrome://net-internals/#hsts;

对于Edge,可以访问edge://net-internals/#hsts;

对于其它浏览器,可以自行搜索一下在哪配置HSTS~

找到Delete字眼,输入域名,按下Delete按钮,删除记录!

在这里插入图片描述

删除完成后,面板就可以正常访问了!

但是,还没完!

2、方案1:立即给面板添加https访问(最优)

只需在1Panel→面板设置→安全→HTTPS,开启并选择之前传过的证书就好。

设置完以后就高枕无忧了,面板也安全了,也不会再因为上述问题导致无法访问。

在这里插入图片描述

至此,问题解决。

2、方案2:删除Strict-Transport-Security响应头

删除响应头意味着以后的HTTP访问都需要经过一次301重定向,不推荐。

当然,如果确实有同域名不同端口的服务(比如面板)不想/无法启用https访问,那也只能这样了。

① 修改配置文件/opt/1panel/apps/openresty/conf/conf.d/xxx.example.com.conf 如下:

# ...
ssl_prefer_server_ciphers on; 
ssl_session_cache shared:SSL:10m; 
ssl_session_timeout 10m;
# 注释掉下面这行
# add_header Strict-Transport-Security "max-age=31536000"; 
error_page 497 https://$host$request_uri; 
proxy_set_header X-Forwarded-Proto https; 
# ...

② 重载OpenResty服务,详见附录:重载OpenResty服务

附录

(错误的)修改配置文件

警告:此步骤是多余的,是因为刚开始自己对这个问题的理解不够透彻。保留在此只是为了记录在哪修改、Nginx如何进行多条件判断。

1Panel的OpenResty是在容器中运行的,文件持久化保存在/opt/1panel/apps/openresty/

我们需要手动修改配置文件,找到/opt/1panel/apps/openresty/conf/conf.d/xxx.example.com.conf ,修改配置文件如下:

# 如此写是因为,nginx的配置不支持&&和嵌套if
# 当http且80端口时,才强制https
set $flag 0;
if ($scheme = http) {
    set $flag "${flag}1";
}
if ($server_port = 80) {
    set $flag "${flag}2";
}
if ($flag = 012) {
    return 301 https://$host$request_uri;
}

# 以下的原来的配置
# if ($scheme = http) {
#     return 301 https://$host$request_uri;
# }

其实1Panel添加的server配置块里是有指定listen 80;的,其它端口不会访问这个server块,在此问题中并不需要这样子操作。

重载OpenResty服务

提示:执行docker命令,如果不是root用户,记得加上sudo~

① 首先,使用docker ps | grep -i openresty查看容器的名称/ID

$ docker ps | grep -i openresty

在这里插入图片描述

第一串字符是容器ID、1Panel开头的是容器名称,这俩都能用作容器的标识

② 进入容器,执行命令:

# 进入容器CONTAINER_ID的命令行
$ docker exec -it CONTAINER_ID /bin/bash # docker exec -it 2931c7b68ebc /bin/bash

# 检查配置文件确认配置修改正确
$ openresty -t
# nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
# nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful

# 见到ok字样后重载配置文件, 立即生效;如果没有ok, 说明配置文件有问题, 根据提示修改!
$ openresty -s reload

至此,服务重载完成。

  • 30
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值