问题描述
今天在使用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开头的是容器名称,这俩都能用作容器的标识
② 进入容器,执行命令:文章来源:https://www.toymoban.com/news/detail-821590.html
# 进入容器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
至此,服务重载完成。文章来源地址https://www.toymoban.com/news/detail-821590.html
到了这里,关于记录一次1Panel配置SSL导致的面板访问失败的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!