免費的SSL證照,國內的阿里、騰訊等雲服務商都有提供,但是他們的證照都只是免費一年,而且不支援免費的萬用字元證照,收費的證照至少都是1k/年以上,對於個人使用者肯定是承受不了的,幸好我們還有Let’s Encrypt。通過Let's Encrypt
申請的證照,雖然有效期只有90天,但是我們可以通過工具自動續期,並且它支援免費的萬用字元證照,也就是說我們只需要申請一個證照,就可以應用在多個Web應用上了。
Let's Encrypt
是一個於2015年三季度推出的數字證照認證機構 ,旨在以自動化流程消除手動建立和安裝證照的複雜流程,並推廣使全球資訊網伺服器的加密連線無所不在,為安全網站提供免費的傳輸層安全性協議(TLS)證照。Let's Encrypt
得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等眾多公司和機構的支援,發展十分迅猛。
網上有不少使用基於Let's Encrypt
指令碼來建立證照的文章,不過目測大部分都有文章都有一定的歷史了,本文是按照官網的步驟一步步來配置的,可以說是全網最新的了。
- DNS提供商:阿里雲
- 伺服器:CentOS Linux release 8.4.2105
- 證照型別:DV SSL證照,萬用字元證照
關於證照型別的知識可參考:cloud.tencent.com/developer/articl...
snap
就像是你手機上的應用市場,通過它你可以很方便的為Linux安裝、管理系統上的應用。稍後我們會使用snap
來安裝certbot
。
新增EPEL
庫
$ sudo dnf install epel-release
$ sudo dnf upgrade
安裝snapd
yum install snapd
啟用管理snap通訊套接字的Systemd unit
$ sudo systemctl enable --now snapd.socket
啟用經典snap支援
$ sudo ln -s /var/lib/snapd/snap /snap
Certbot是一個免費開源的工具,它可以幫助我們申請和更新Let's Encrypt
的證照。
將snapd
更新到最新版
$ sudo snap install core; sudo snap refresh core
刪除舊的certbot/certbot-auto的安裝包
$ sudo dnf remove certbot
安裝certbot
$ sudo snap install --classic certbot
連結certbot
命令
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
確認所安裝的外掛將具有與Certbot snap相同的經典包含性。(機翻,實在不知道是什麼意思)
$ sudo snap set certbot trust-plugin-with-root=ok
輸入下面的命令生成*.xxx.com
這個泛域名的證照:
$ certbot certonly -d "*.xxx.com" --manual --preferred-challenges dns-01
引數解釋:
certonly
獲取或者更新一個證照,但是不要安裝它。-d "*.xxx.com"
你要獲取證照的域名,多個域名以逗號分隔。*
表示這是一個萬用字元域名。注意,萬用字元域名證照只能保護一個域名以及該域名的所有下一級域名,如果你要保護a.b.xxx.com
這樣的二級域名,則需要再申請一個*.b.xxx.com
的萬用字元域名證照。--manual
以互動方式或使用 shell 指令碼勾子獲取證照--preferred-challenges dns-01
告訴certbot
用什麼樣的方法來校驗域名是屬於你的,萬用字元域名只能使用dns-01
的方式,即在你的DNS提供商那裡新增一個特定的TXT域名解析記錄。
更多的命令引數參考:
certbot.eff.org/docs/using.html#ce...
敲擊回車後,進入互動模式,這裡需要你輸入郵箱,確認一下協議,大致流程如下圖(圖片來源):
在生成證照的最後一步,命令列會提示你新增DNS TXT記錄,這時先不要按Enter鍵,在你的DNS提供商裡為你的域名新增一個TXT解析記錄,例如阿里雲的:
新增完成後,等個10來秒,一般就生效了,這時回到命令列介面,按下Enter鍵,檢查證照是否生成成功。certbot
一般會將證照生成在/etc/letsencrypt/live/xxx.com/
這樣的目錄下。
獲取證照成功後,你可以使用下面的命令來嘗試更新證照:
$ sudo certbot renew --dry-run
--dry-run
表示只是執行命令,並不真正執行更新操作,如無意外,你會看到下面的出錯資訊:
不用慌,這是正常現象,回想我們生成證照的步驟,在最後一步的校驗中,需要我們在DNS提供商裡面新增一個certbot
指定的TXT記錄,但是certbot
並不知道我們DNS提供商的賬號資訊,自然不可能自動為我們新增了。錯誤資訊裡有一個關鍵的資訊:
The error was: PluginError(‘An authentication script must be provided with –manual-auth-hook when using the manual plugin non-interactively.’)
它提示我們在非互動模式下,可以使用--manual-auth-hook
這個選項指定一個勾子指令碼,在這個指令碼里面完成新增TXT記錄的操作。一般DNS提供商都有API提供給我們,我們可以自已寫指令碼呼叫API新增TXT記錄,也可以使用github上的這個倉庫
簡單總結一下使用這個倉庫更新證照的步驟
克隆程式碼
$ git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
配置根域名
檢視domain.ini
裡面有沒有你的根域名,如果沒有的話,需要自行新增。配置DNS API 金鑰
去你的DNS提供商那裡獲取呼叫API所需的KEY和金鑰,填寫在auth.sh
檔案中再次執行
$ certbot renew --manual-auth-hook "指令碼目錄/au.sh python aly add" --manual-cleanup-hook "指令碼目錄/au.sh python aly clean" --dry-run
--manual-cleanup-hook
這個選項是指定清理資料的指令碼,這裡這個指令碼的作用是清除用作驗證的TXT記錄。注意這裡面新增了--dry-run
選項,表示只是測試更新流程是否正確,並不是真的更新證照。定時更新證照
成功使用指令碼更新證照後,我們可以在crontab
中新增一個定時任務,來實現自動更新證照的任務,這樣就可以一勞永逸,不用擔心證照會失效了。編輯crontab
,新增以下任務:# 證照有效期小於30天才會renew,所以crontab可以配置為1天或1周 1 1 */1 * * certbot renew --manual-auth-hook "指令碼目錄/au.sh python aly add" --manual-cleanup-hook "指令碼目錄/au.sh python aly clean"
本作品採用《CC 協議》,轉載必須註明作者和本文連結