给HTTP服务添加SSL证书,防⽌中间⼈攻击——使⽤acme.sh申
请证书并配置HTTPS访问
基于⽹络的普及和⽹速的提升,我们普通⽤户也可以搭建⾃⼰的HTTP服务并开放到公⽹中⽅便我们随时随地访问,如开源的智能家居系统Home Assistant、⽀持WebDAV协议的⽹盘、⽹络摄像机等。不过HTTP协议是使⽤明⽂传输⽅式来传输信息的,当你访问只⽀持HTTP协议的⽹站,在经过路由器、宽带接⼊商等中间环节时,搜索的关键字、账号密码等都是可见的,这些信息很容易被截获从⽽造成重要数据的泄露。这样就产⽣了由SSL + HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议:HTTPS协议。在HTTPS协议下传输数据,客户端会将数据加密后发送到服务器,服务器解密后获得数据,反之亦然。在此过程中,数据通过密钥进⾏加密,这样即使中间环节劫持到内容也会因没有密钥⽆法破解。
下⾯我们就为⾃⼰的HTTP服务配置SSL证书并使服务可以从公⽹访问。
⼀、申请域名并绑定⾃⼰的公⽹IP地址
⽬前三⼤运营商基本都⽀持IPv6了,只要你有⼀个⽀持IPv6的路由器就可以为你的上⽹设备分配到公⽹IPv6地址,不过这个地址是会变动的,我们需要实时将变动后的IP地址绑定到域名上,接下来我以dynv6的使⽤为例,申请域名并配置DDNS。
1.申请域名
到这个⽹站使⽤邮箱注册⼀下,在经过邮箱验证后就可以创建⾃⼰的域名了,如下图:
在Name后的⽂本框中给域名起个名字,点击“Create Zone”按钮,记录下图红框中的域名和token
2.绑定域名和IP地址
下载脚本
使⽤WinSCP或SecureCRT等⼯具将脚本上传到需要绑定的设备中(我这⾥使⽤Armbian的root⽤户做演⽰,将脚本上传⾄/usr/local/bin⽬录)
赋予脚本执⾏权限
cd /usr/local/bin
chmod u+x dynv6.sh
编辑定时任务
crontab -e
添加以下内容
* * * * * token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /usr/local/bin/dynv6.sh v6test.dns.army
等待⼀分钟后,查看当前⽬录中是否⽣成.dynv6.addr6⽂件(使⽤ls -la命令查看隐藏⽂件)
查看⽂件内容
cat .dynv6.addr6
使⽤以下命令解析域名v6test.dns.army的IP地址
nslookup v6test.dns.army 8.8.8.8
解析出来的IPv6地址与.dynv6.addr6中的⼀致则动态域名服务配置成功
3.配置泛域名
我们在⾃⼰创建的域名下切换到Records标签,添加⼀条CNAME记录,如下图:
Name中填⼊“*”后点保存
追加:最近发现在给dynv6域名添加CNAME记录时,Name中填写“*”保存后过⼀会⼉此条CNAME记录就会被删除,导致⼦域名解析失败。可以分别添加⼦域名的CNAME记录,⽐如我在Caddy中配置的⼦域名有file、hass、docker、op这⼏个,那么就在Records标签中按照下图添加CNAME即可
⼆、安装acme.sh并⽣成证书
1.安装acme.sh
下载acme.sh
wget github/acmesh-official/acme.sh/archive/
解压
tar -zxvf
进⼊解压后的⽬录
cd acme.sh-master/
安装到指定⽬录并配置邮箱地址
./acme.sh --install \
--home /usr/local/acme.sh \
--accountemail xxxxxx@xx
安装成功后可以删除下载的压缩包和解压⽬录
cd .. && rm -rf acme.sh-master/ && rm -rf
进⼊安装⽬录
cd /usr/local/acme.sh
配置acme⾃动更新
./acme.sh --home ./ --upgrade --auto-upgrade
2.⽣成域名对应的证书
设置dynv6的HTTP TOKEN
export DYNV6_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
⽣成证书
./acme.sh --home ./ --issue --dns dns_dynv6 -d v6test.dns.army -d *.v6test.dns.army
三、通过Caddy启⽤HTTPS
1.下载Caddy
创建Caddy存放⽬录
mkdir -p /usr/local/caddy
到Caddy官⽹()下载对应平台的⼆进制⽂件(我使⽤的是Armbian 64位系统,平台选择Linux Arm64),选中带有WebDAV插件的可执⾏程序,点击下载
将下载好的Caddy程序上传到/usr/local/caddy⽬录中
修改程序名称为caddy
cd /usr/local/caddy
mv caddy_linux_arm64_custom caddy
赋予执⾏权限
chmod u+x caddy
2.配置Caddyfile
创建SSL证书存放⽬录
mkdir -p /usr/local/caddy/ssl
在/usr/local/caddy⽬录创建⽂件
vim Caddyfile
填写配置内容
{
# 指定http端⼝为85
http_port 85
order webdav before file_server
}
# WebDAV服务,⼦域名设置为file,指定https端⼝为8443
file.v6test.dns.army:8443 {
# 设置/mnt/XiaoMi为可以被访问的⽬录,可⾃⾏修改为想要访问的⽬录
root * /mnt/XiaoMi
encode gzip
# 在Caddy⽬录中使⽤以下命令⽣成密码,此处以12345为例
# ./caddy hash-password --plaintext 12345
basicauth {
test JDJhJDE0JFo4TkxBUjQ1YTdZVXdQQ3BvUjA2Z09POTFSVkwzRnZLalh4QkY3OW14Rks3Q3pkRzkwWDdH
}
# 指定证书⽂件存放位置,绝对路径为/usr/local/caddy/ssl,此处使⽤Caddyfile⽂件所在⽬录(/usr/local/caddy)的相对路径 tls ssl/full_chain.pem ssl/private.key
route {
rewrite /webdav /webdav/
webdav /webdav/* {
# 访问WebDAV服务的前缀
prefix /webdav
}
# HTTP⽂件服务,可以在浏览器中查看下载⽂件
file_server browse
}
}
# 代理HomeAssistant
hass.v6test.dns.army:8443 {
encode gzip
tls ssl/full_chain.pem ssl/private.key
reverse_proxy localhost:8123
}
# 代理Portainer
docker.v6test.dns.army:8443 {
encode gzip
tls ssl/full_chain.pem ssl/private.key
reverse_proxy localhost:9001
}
# 代理OpenWrt
op.v6test.dns.army:8443 {
encode gzip
tls ssl/full_chain.pem ssl/private.key
reverse_proxy 192.168.2.202
}
3.使⽤acme.sh安装证书
进⼊acme.sh⽬录
cd /usr/local/acme.sh
安装证书到指定⽬录并重新载⼊caddy配置
./acme.sh --home ./ --install-cert -d v6test.dns.army \
--key-file /usr/local/caddy/ssl/private.key \
--fullchain-file /usr/local/caddy/ssl/full_chain.pem \
--reloadcmd "cd /usr/local/caddy && ./caddy reload"
进⼊证书存放⽬录
cd /usr/local/caddy/ssl
可以看到已经⽣成full_chain.pem和private.key两个⽂件
4.验证配置⽂件是否有效
回到caddy⽬录
cd /usr/local/caddy
测试配置⽂件是否正确
./caddy validate
没有错误信息则证明配置⽂件没有问题
5.启动Caddy
启动Caddy
./caddy run
测试配置的WebDAV和反向代理没有问题的话可以后台启动
./caddy start
设置开机时⾃动运⾏Caddy
vim /etc/rc.local
在exit 0上⾯添加以下命令
cd /usr/local/caddy
nohup ./caddy run > /dev/null 2>&1 &
四、开放公⽹IPv6访问端⼝
这⾥分别介绍Padavan和OpenWrt开放IPv6访问端⼝的⽅法。
1.Padavan开启IPv6外⽹访问端⼝
(1)开启路由器⾃⾝端⼝
ip6tables -A INPUT -p tcp --dport 85 -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport 85 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 8443 -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport 8443 -j ACCEPT
(2)开启局域⽹其他设备端⼝
ip6tables -A FORWARD -p tcp --dport 85 -j ACCEPT
ip6tables -A FORWARD -p tcp --dport 8443 -j ACCEPT
(3)开机⾃动开放端⼝
在“⾼级设置”->“⾃定义设置”->“脚本”->“在防⽕墙规则启动后执⾏:”最后添加以下内容# 开启路由器⾃⾝端⼝
ip6tables -A INPUT -p tcp --dport 85 -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport 85 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 8443 -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport 8443 -j ACCEPT
# 开启局域⽹其他设备端⼝
ip6tables -A FORWARD -p tcp --dport 85 -j ACCEPT
ip6tables -A FORWARD -p tcp --dport 8443 -j ACCEPT
点击最下⾯的“应⽤本页⾯设置”
2.OpenWrt开启IPv6外⽹访问端⼝
(1)开启路由器⾃⾝端⼝
ip6tables -I INPUT -p tcp --dport 85 -j ACCEPT
ip6tables -I OUTPUT -p tcp --sport 85 -j ACCEPT
ip6tables -I INPUT -p tcp --dport 8443 -j ACCEPT
ip6tables -I OUTPUT -p tcp --sport 8443 -j ACCEPT
(2)开启局域⽹其他设备端⼝
ip6tables -I FORWARD -p tcp --dport 85 -j ACCEPT
ip6tables -I FORWARD -p tcp --dport 8443 -j ACCEPT
(3)开机⾃动开放端⼝
vim /etc/rc.local
在exit 0上⾯添加
# 开启路由器⾃⾝端⼝
ip6tables -I INPUT -p tcp --dport 85 -j ACCEPT
ip6tables -I OUTPUT -p tcp --sport 85 -j ACCEPT
ip6tables -I INPUT -p tcp --dport 8443 -j ACCEPT
ip6tables -I OUTPUT -p tcp --sport 8443 -j ACCEPT
免费ssl证书永久生成
# 开启局域⽹其他设备端⼝
ip6tables -I FORWARD -p tcp --dport 85 -j ACCEPT
ip6tables -I FORWARD -p tcp --dport 8443 -j ACCEPT
保存退出
四、使⽤Caddy配置的域名加端⼝访问HTTPS服务这样我们的HTTPS服务就配置完成了。