近來使用Halo搭建博客,並順便把WeHalo小程序也把玩了起來,但是發現幾個非常棘手的問題:
- 根據訪問日志發現有三方在刷取關鍵接口的請求,http請求在部分情況下會暴露出很顯著的安全問題;
- 小程序強制依賴https,非https連接不能使用,嘗試三方開源的v-request替換也是效果不太好;
- 第三個問題是由以上問題衍生的,如果升級https網站域名首先就是需要備案,對於個人博客來說,穩定性要求沒有那么高,備案流程復雜,想想還是算了吧;
那能怎么辦呢?條件不夠,技術來湊。
眾所周知,http和https請求的默認端口分別為80和443,那么能否實現非標准端口的https呢,這樣就能繞過未備案的限制。
經過對https資料的查找,發現有很大希望實現,有這么關鍵的幾點。
https基本原理就不在熬述了,直接引用資料原文:
通過 ACME 協議向 Let's Encrypt 證明自己的域名所有權的過程就叫做 Challenge (驗證),目前有三種 Challenge 的方式:
- HTTP-01
- NS-01
- TLS-SNI-01 (已禁用)
- TLS-ALPN-01
HTTP-01是目前最常見的驗證方式,但是該驗證方式需要通過80端口開放一個路徑給Let's Encrypt訪問它提供的 token來驗證你的域名所有權,因此在80端口被封鎖的情況下這個驗證方式是不現實的;
類似的,TLS-ALPN-01需要通過443端口訪問來驗證,也是行不通;
這樣對於國內家庭帶寬用戶來說就只剩下了一種方式:DNS-01。
了解這些后,解決方案就一目了然了,就是用DNS-01方式進行https驗證。
有了這些信息,想法可行,接下來就是尋找合適的工具來實現了。
caddy給我們進行了很好的集成,基於golang的caddy就是一個編譯過后的二進制文件,輕巧、實用。
caddy原生https的實現是基於Let's Encrypt的,想要使用DNS-01的https實現需要附帶插件,這里我們阿里雲的dns服務商,需要選擇 github.com/caddy-dns/lego-deprecated;
下載完成后的caddy文件就是包含附件的可執行文件了;
接下來我們編寫Caddyfile配置文件,有兩個配置要點:
- 指定http和https監聽端口;
- 配置請求指向;
{
http_port 1234
https_port 2234
}
xxx {
reverse_proxy localhost:8081
tls {
dns lego_deprecated alidns
}
}
配置完成還不行,我們需要按照lego_deprecated的文檔,建立文件,配置以下:
ALICLOUD_ACCESS_KEY=xxx
ALICLOUD_SECRET_KEY=xxx
關鍵參數(此部分參數需要從阿里雲后台進行獲取),便於聯系對應dns進行相關的操作;
最后使用caddy指令帶上配置好的文件直接啟動
caddy run --config Caddyfile --envfile alidns.env
大功告成!