給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.申請域名

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中配置的子域名有filehassdockerop這幾個,那么就在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訪問端口的方法。

1Padavan開啟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

點擊最下面的“應用本頁面設置”

2OpenWrt開啟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服務就配置完成了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM