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下来,证书目录 在

1
/etc/acme/你的域名/

简单处理openwrt的nginx证书

openwrt的配置文件 /etc/nginx/uci.conf 但这个文件实际是tmp目录ln过来的修改后无效

如果你不需要443自动重定向端口功能,可以直接用ls方法 替换证书文件,可以跳过下面的操作继续看后面

1
2
3
4
5
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

1
 /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 内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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一般不建议挂载目录出来。

1
0 13 * * *  rm -rf /etc/acme.sh && docker cp nginxwebui:/home/nginxWebUI/.acme.sh  /etc/acme.sh

同时也要修改上面的nginx的配置文件里面的路径和域名地址即可,example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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;
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计