一起聊聊如何使用ACME申請SSL證書
前言
通過https協議訪問網站時,SSL證書確保了數據傳輸的安全性。目前,大多數云服務提供商提供的免費證書有效期只有90天,想要更長時間的證書則需要付費。這意味著每隔90天就需要重新簽發并替換證書文件。
折騰一番后,我找到了一個免費且優雅的方案,只需要在服務器上安裝相關腳本,就能申請到免費的域名證書,它會定期檢查證書的有效期,實現到期自動續期與更新,從而有效地獲得了一個“永久”的證書。
本文就跟大家詳細分享下這個方案,歡迎各位感興趣的開發者閱讀本文。
環境搭建
我們需要用到ACME[1]這個程序來完成證書的申請與簽發。
程序安裝
首先,我們需要通過SSH連接到服務器,通過以下命令來安裝:
curl https://get.acme.sh | sh
安裝程序會自動做以下操作:
? 自動把acme.sh安裝到你的 home 的.acme.sh目錄下,即~/.acme.sh/
? 自動創建一個 bash的別名,方便命令行的直接使用: alias acme.sh=~/.acme.sh/acme.sh
? 自動為你創建 cron任務, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新,則會自動更新證書。
更改默認證書
因為acme已經被ZeroSSL收購,其默認的證書方式為ZeroSSL,但此證書生成時會攜帶郵箱,因此需要更換為letsencrypt[2]
acme.sh --set-default-ca --server letsencrypt
申請泛域名證書
泛域名證書是一種能夠為同一個主域名(例如kaisir.cn)下的所有子域名(如www.kaisir.com、resource.kaisir.cn等)提供安全加密的數字證書。能夠通過一個單一的證書來保護主域名及其所有子域名的數據傳輸,使得網站管理者無需為每個子域名分別購買和管理多個SSL證書。[3]
通過acme申請的證書,可以綁定滿足該通配符型規則的任意三級子域名,例如:
www.kaisir.cn
test.kaisir.cn
aaa.kaisir.cn
bb.kaisir.cn
...
如果你對數字證書比較感興趣,可以移步我的另一篇文章:數字證書的理解[4]
獲取 DNS API 參數
acme提供的泛域名證書只能通過dns的形式來做驗證,因此我們需要進入域名解析控制臺(你可以在此處[5]找到你的域名解析提供商)創建API ID 和 API Key。
我這里以阿里云為例,登錄成功后,去到阿里云的RAM訪問控制面板[6]來創建用戶。
圖片
? 創建完用戶之后,點擊添加權限按鈕
圖片
? 勾選第一頁的所有權限
圖片
? 復制AccessKey ID和AccessKey Secret下來,保存好。
圖片
配置環境變量
由于每個平臺的環境變量名稱是不一樣的,因此你需要去acme-dnsapi網站[7]里找到你平臺的變量名。我這里以阿里云為例,將key和secret換成上一步創建的即可。
export Ali_Key="key"
export Ali_Secret="secret"
生成證書
做完上述操作后,我們的準備工作就做完了,可以使用acme.sh腳本來創建證書了。
acme.sh --issue --dns dns_ali -d kaisir.cn -d '*.kaisir.cn' --dnssleep 300 --debug
? --dns 用于指定dns校驗平臺,我這里是阿里云
? 第一個-d是你的網站主域名,第二個是泛域名
? --dnssleep用于等待操作,因為把txt添加到后臺,解析不一定能做到立刻生效,所以需要延時一下,此處我設置了300秒的延時,執行命令的過程會有個等待倒計時。
? --debug開啟調試模式,創建過程中會打印詳細的日志出來,方便定位錯誤。
創建成功后,你將看到如下所示的內容:
圖片
安裝證書
最后,我們只需要找到創建好的證書,將其在服務器上的路徑填寫到nginx中即可。腳本會在證書快到期時,自動續期并創建相關文件。
本章節將以我的服務器為例,跟大家分享下如何去做相關的配置。
配置路徑映射
如果你的服務是直接運行在宿主機上的,請跳過這一步。
我的服務是運行在docker容器里的,因此需要先把服務器的證書路徑映射進容器中,此處我以docker-compose為例,在volumes節點下添加映射即可。
nginx-server:
image: nginx:1.18.0
container_name: local_nginx
volumes:
- /root/.acme.sh/kaisir.cn_ecc:/usr/share/acme
注意:如果你只使用了docker,則需要在運行docker run指令時,通過添加-v參數來添加路徑映射,例如docker run -v /root/.acme.sh/kaisir.cn_ecc:/usr/share/acme。
? /root/.acme.sh/kaisir.cn_ecc 是宿主機上的路徑
? /usr/share/acme是容器內部的路徑
如果你對docker不是很了解,可以移步我的另一篇文章:使用docker來編排Web應用[8]
配置nginx
隨后,我們就可以打開nginx的配置文件,指定ssl證書的位置即可。
? /usr/share/acme/就是我們上一步所映射出來的路徑
? fullchain.cer就是我們申請到的泛域名證書
server {
# 配置ssl證書
ssl_certificate /usr/share/acme/fullchain.cer;
ssl_certificate_key /usr/share/acme/kaisir.cn.key;
}
實現效果
最后,我們重啟nginx,通過瀏覽器訪問網站就能看到證書信息了??
圖片
? 訪問子域名的服務也是正常的
圖片
? 證書詳情如下所示
圖片
引用鏈接
[1] ACME: https://letsencrypt.org/zh-cn/docs/client-options/
[2] letsencrypt: https://letsencrypt.org/
[3] www.kaisir.com、resource.kaisir.cn等)提供安全加密的數字證書。能夠通過一個單一的證書來保護主域名及其所有子域名的數據傳輸,使得網站管理者無需為每個子域名分別購買和管理多個SSL證書。: http://www.kaisir.com、resource.kaisir.cn等)提供安全加密的數字證書。能夠通過一個單一的證書來保護主域名及其所有子域名的數據傳輸,使得網站管理者無需為每個子域名分別購買和管理多個SSL證書。
[4] 數字證書的理解: https://www.kaisir.cn/post/58
[5] 此處: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
[6] RAM訪問控制面板: https://ram.console.aliyun.com/users
[7] acme-dnsapi網站: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
[8] 使用docker來編排Web應用: https://www.kaisir.cn/post/175
[9] 個人網站: https://www.kaisir.cn/