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

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

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

1、我们先搞定域名的问题(如果你已经有自己的域名并且指向到你自己的路由器,可以直接跳到第二步)
去买个便宜的cn域名并且完整国内的实名认证
或者去国外买个或者不买直接申请个免费的~
然后把dns服务器改为dnspod~让dnspod来管理你的域名
(并不一定要用dnspod,但我是用这个来实现的~)

建立一个二级域名,用于你家的路由器的访问,当然直接主域名怼上去也没啥不妥

然后申请个API Token
你会得到一个ID和一个Token
复制下来~等会儿会用到~

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

#!/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\}\).*//p')}

api_call() {
	local param="login_token=${token}&format=json&domain=${domain}&"
	curl -s -k -XPOST -o- -A'shdns/0.1([email protected])' -d $param https://dnsapi.cn/
}

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.]*\)".*//')
[ "$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]*\)".*//')
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脚本
内容是

sh /etc/ddns/dnspod.sh 主域名 二级域名

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

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

curl https://get.acme.sh | sh

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

进入.acme.sh目录

cd /root/.acme.sh

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

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

然后开始签发

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

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

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

/etc/init.d/uhttpd restart


你就会发现你的域名可以访问终于没有红色感叹号了~
由于强迫症所导致的对红色感叹号有过敏症现象神奇的治愈了~~

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