基於網絡的普及和網速的提升,我們普通用戶也可以搭建自己的HTTP服務並開放到公網中方便我們隨時隨地訪問,如開源的智能家居系統Home Assistant、支持WebDAV協議的網盤、網絡攝像機等。不過HTTP協議是使用明文傳輸方式來傳輸信息的,當你訪問只支持HTTP協議的網站,在經過路由器、寬帶接入商等中間環節時,搜索的關鍵字、賬號密碼等都是可見的,這些信息很容易被截獲從而造成重要數據的泄露。這樣就產生了由SSL + HTTP協議構建的可進行加密傳輸、身份認證的網絡協議:HTTPS協議。在HTTPS協議下傳輸數據,客戶端會將數據加密后發送到服務器,服務器解密后獲得數據,反之亦然。在此過程中,數據通過密鑰進行加密,這樣即使中間環節劫持到內容也會因沒有密鑰無法破解。
下面我們就為自己的HTTP服務配置SSL證書並使服務可以從公網訪問。
一、申請域名並綁定自己的公網IP地址
目前三大運營商基本都支持IPv6了,只要你有一個支持IPv6的路由器就可以為你的上網設備分配到公網IPv6地址,不過這個地址是會變動的,我們需要實時將變動后的IP地址綁定到域名上,接下來我以dynv6的使用為例,申請域名並配置DDNS。
1.申請域名
到Free dynamic DNS for IPv6 (dynv6.com)這個網站使用郵箱注冊一下,在經過郵箱驗證后就可以創建自己的域名了,如下圖:
在Name后的文本框中給域名起個名字,點擊“Create Zone”按鈕,記錄下圖紅框中的域名和token
2.綁定域名和IP地址
下載腳本dynv6.sh
使用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 https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
解壓
tar -zxvf master.tar.gz
進入解壓后的目錄
cd acme.sh-master/
安裝到指定目錄並配置郵箱地址
./acme.sh --install \ --home /usr/local/acme.sh \ --accountemail xxxxxx@xx.com
安裝成功后可以刪除下載的壓縮包和解壓目錄
cd .. && rm -rf acme.sh-master/ && rm -rf master.tar.gz
進入安裝目錄
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官網(Download Caddy (caddyserver.com))下載對應平台的二進制文件(我使用的是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目錄創建Caddyfile文件
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 && killall -9 caddy; nohup ./caddy run > /dev/null 2>&1 &"
進入證書存放目錄
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
或
# 開啟局域網其他設備端口 ip6tables -I FORWARD -p tcp --dport 85 -j ACCEPT ip6tables -I FORWARD -p tcp --dport 8443 -j ACCEPT
保存退出
四、使用Caddy配置的域名加端口訪問HTTPS服務
我們使用docker.v6test.dns.army:85這個地址訪問Portainer,可以看到地址欄網址會自動跳轉到https://docker.v6test.dns.army:8443,而且地址欄前面會顯示“連接安全” 的小鎖,如下圖:
這樣我們的HTTPS服務就配置完成了。