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