在80端口被封的情况下,给家里的OpenWRT添加SSL证书 | Chris.Leung

  • A+
所属分类:Linux

Posted by | Mar 14, 2019 | 技术分享 | 0 |

在80端口被封的情况下,给家里的OpenWRT添加SSL证书 | Chris.Leung

首先戴头盔
在家里的路由器部署SSL证书对于绝大部分人来说并没有实际意义
甚至会让你的访问略微变慢
但如果你是企业用户或者你对路由器的远程访问安全有较高的要求
或者跟我一样有强迫症见到浏览器的红色感叹号有过敏症现象
那么https你值得拥有~
并且我说的步骤也并非纯原创大部分来自与Github或者一些网上的文章然后自己实施过可行
做法或许会略显拙劣或者土炮
如果你是高手欢迎留言

首先说说前提条件:
1、需要你有个域名
2、你要有个OpenWRT路由器并且有公网IP
3、你要有点儿Linux基础知识

那么我们开始说实际步骤了

1、我们先搞定域名的问题(如果你已经有自己的域名并且指向到你自己的路由器,可以直接跳到第二步)
去买个便宜的cn域名并且完整国内的实名认证
或者去国外买个或者不买直接申请个免费的~
然后把dns服务器改为dnspod~让dnspod来管理你的域名
(并不一定要用dnspod,但我是用这个来实现的~)
在80端口被封的情况下,给家里的OpenWRT添加SSL证书 | Chris.Leung
建立一个二级域名,用于你家的路由器的访问,当然直接主域名怼上去也没啥不妥
在80端口被封的情况下,给家里的OpenWRT添加SSL证书 | Chris.Leung
然后申请个API Token
你会得到一个ID和一个Token
复制下来~等会儿会用到~

然后上github找一个可以用的ddns脚本~
我这里给一个我自己实测可以用的~
在创建/etc/ddns/目录
在里面创建文件dnspod.sh
内容是

| | |
| --- | --- |
| 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35 | #!/bin/sh

token=``'ID,Token'

domain=${1:-``'css.js.cn'``}

sub_domain=${2:-``'c'``}

new_ip=${3:-$(curl -s http:``//checkip``.dyndns.com \| sed -n 's/.*: \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p'``)}

api_call() {

local param=``"login_token=${token}&format=json&domain=${domain}&${2}"

curl -s -k -XPOST -o- -A``'shdns/0.1([email protected])' -d $param https:``//dnsapi``.cn/${1}

}

api_error() {

local key=``'"code":"1",'

[ "${1#*$key}" = "$1" ] && {

echo "error: $2"

echo $1

exit 1

}

}

(``echo "$new_ip" \| grep -Eq "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$"``) \| {

echo "Invalid IP: ${new_ip}"

exit 1

}

record=$(api_call "Record.List" "sub_domain=${sub_domain}"``)

api_error "$record" "Unable to find the record."

old_ip=$(``echo "$record" \| sed 's/.*"value":"\([0-9.]*\)".*/\1/'``)

[ "$old_ip" = "$new_ip" ] && {

echo "Record(${new_ip}) not changed. Skipped."

exit 0

}

echo "Changing A record(${sub_domain}.${domain}) from ${old_ip} to ${new_ip} ..."

record_id=$(``echo "$record" \| sed 's/.*\[{"id":"\([0-9]*\)".*/\1/'``)

result=$(api_call "Record.Ddns" "record_id=${record_id}&sub_domain=${sub_domain}&record_type=A&value=${new_ip}&record_line=%E9%BB%98%E8%AE%A4"``)

api_error "$result" "Failed to update recode." |

然后在/etc/hotplug.h/iface/目录下
建立一个00-ddns脚本
内容是

| | |
| --- | --- |
| 1 | sh /etc/ddns/dnspod``.sh 主域名 二级域名 |

当然了~给权限肯定是要的了~~
那么你就实现了ddns了

然后开始来SSL了
在root目录下运行

| | |
| --- | --- |
| 1 | curl https:``//get``.acme.sh \| sh |

没有curl就自己opkg install
系统会自动下载acme以及自动把自动续签加到你的路由器的定期任务中
所以基本不用管
当然如果你的路由器的定期任务没启动就自己想办法了~Google一下你就知道得太多了~

进入.acme.sh目录

这里有很多种办法签发证书~
但是由于众所周知的原因~一般家里上网80端口是被封住的~
所以我们这里用dnspod的api token来签发证书
对!就是刚才申请那个

| | |
| --- | --- |
| 1 | echo -e "DP_Id='你的ID'\nDP_Key='你的Token'" >>``/root/``.acme.sh``/account``.conf |

然后开始签发

| | |
| --- | --- |
| 1 | .``/acme``.sh --issue --dns dns_dp -d 你的域名 |

最后在.acme.sh/目录下会出现你的域名命名的目录
然后这里用比较土炮的办法部署
但openwrt默认并没有安装ssl我们这里先安装

| | |
| --- | --- |
| 1

2 | opkg update

opkg install luci-ssl |

部署完了后
编辑/etc/config/uhttpd


list listen_http ‘0.0.0.0:80’
list listen_http ‘[::]:80’
下面
添加两行
list listen_https ‘0.0.0.0:443’
list listen_https ‘[::]:443’

当然如果已经有了就可以跳过这步
在/root/.acme.sh/你的域名目录下
把你的域名的.key文件覆盖/etc/uhttpd.key
把你的域名的.cer文件覆盖/etc/uhttpd.crt

最后重启uhttpd

| | |
| --- | --- |
| 1 | /etc/init``.d``/uhttpd restart |

在80端口被封的情况下,给家里的OpenWRT添加SSL证书 | Chris.Leung
你就会发现你的域名可以访问终于没有红色感叹号了~
由于强迫症所导致的对红色感叹号有过敏症现象神奇的治愈了~~

PS:
要在内网访问域名的话~还需要在
option rfc1918_filter ‘1’
这一行前面加个#或者强迫症患者可以直接删掉这一行

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin