openwrt 内网套ssl,以及内网标准端口自动跳转非标端口的方法
使用acme.sh 自动管理申请证书,并在openwrt上的luci(nginx)上使用。
由于家用宽带没有80 443端口,所以内网访问到 https://你的域名 自动跳转到 https://你的域名:10443
#op上套ssl
#在openwrt上安装acme.sh
直接安装 luci-app-acme 这个包,依赖会自动安装上。 配置
如果是x86路由,建议docker运行nginx-proxy-manage 或 nginxWebUi等工具,他们自带了acme.sh。支持反向代理什么的。
luci-app-acme 界面有一点怪。
新增 Certificate config 名称随便输入不能用特殊符号
配置,输入 Domain names,如果要泛域名 一起输入,例如 dev.leiyanhui.com 和 *.dev.leiyanhui.com
Challenge Validation 这里设置一下
Validation method 验证模式,在沒有80 443端口的情況下,要實現自動續簽只能使用dns验证的哈
DNS API 接口,我这里用dnspods的,输入dns_dp
DNS API credentials: 这里输入 你dnspods的 token id 和密码 例如:DP_Id="123456" 再加一行DP_Key="XXXXXXXX"
nginx 的那个勾选上
高级设置里面,Days until renewal 输入一个时间,就是续签时间证书的有窍时间,输入一个小于90的数字
稍后会自动申请ssl下来,证书目录 在
/etc/acme/你的域名/
#简单处理openwrt的nginx证书
openwrt的配置文件 /etc/nginx/uci.conf 但这个文件实际是tmp目录ln过来的修改后无效
如果你不需要443自动重定向端口功能,可以直接用ls方法 替换证书文件,可以跳过下面的操作继续看后面
mv /etc/nginx/conf.d/_lan.crt /etc/nginx/conf.d/_lan.crt.bak
mv /etc/nginx/conf.d/_lan.key /etc/nginx/conf.d/_lan.key.bak
ln -s /etc/acme/你的域名/fullchain.cer /etc/nginx/conf.d/_lan.crt
ln -s /etc/acme/你的域名/你的域名.key /etc/nginx/conf.d/_lan.key
#重启nginx
/etc/init.d/nginx restart
完毕
#配置443 自动转发到10443
因为在openwrt搭建了nginxWebUI 用来套内网的服务,并且使用了非标准端口。为了避免麻烦,所以加一个自动跳转
可以使用插件luci-app-nginx-manager ,或者自己在shell里面编辑 文件/etc/config/nginx (可以替换证书)
我这里用luci-app-nginx-manager 新增一个配置文件web_jump 路径/etc/nginx/conf.d/web_jump.conf 内容如下
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 你的域名;
ssl_certificate /etc/acme/你的域名/fullchain.cer;
ssl_certificate_key /etc/acme/你的域名/你的域名.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
return 301 https://$host:10443$request_uri;
}
注意,如果自己在其他地方反代http(s)://路由器内网ip,请不要传递host,不然这里会定位 这里站点造成死循环多次跳转 就打不开了。
#nginxWebUI的双acme.sh
另外 如果 和 nginxWebUI 配合的话,可以不用在op上另外安装acme.sh,改为计划任务定时从 nginxWebUI容器cp证书出来。当然也可以挂载出来。
为了方便docker的备份(阿里云提供免费容器镜像),这种轻量的docker一般不建议挂载目录出来。
0 13 * * * rm -rf /etc/acme.sh && docker cp nginxwebui:/home/nginxWebUI/.acme.sh /etc/acme.sh
同时也要修改上面的nginx的配置文件里面的路径和域名地址即可,example
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jia.leiyanhui.com *.jia.leiyanhui.com;
ssl_certificate /etc/acme.sh/*.jia.leiyanhui.com/fullchain.cer;
ssl_certificate_key /etc/acme.sh/*.jia.leiyanhui.com/*.jia.leiyanhui.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
return 301 https://$host:10443$request_uri;
}