Let's Encrypt - 免費SSL/TLS證書用起來

諾大的院子發表於2021-06-26

  免費的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指令碼來建立證照的文章,不過目測大部分都有文章都有一定的歷史了,本文是按照官網的步驟一步步來配置的,可以說是全網最新的了。:laughing:

  • 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相同的經典包含性。(機翻,實在不知道是什麼意思:innocent:)

$ 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...

  敲擊回車後,進入互動模式,這裡需要你輸入郵箱,確認一下協議,大致流程如下圖(圖片來源):
Let's Encrypt - 免費SSL/TLS證照用起來

  在生成證照的最後一步,命令列會提示你新增DNS TXT記錄,這時先不要按Enter鍵,在你的DNS提供商裡為你的域名新增一個TXT解析記錄,例如阿里雲的:

Let's Encrypt - 免費SSL/TLS證照用起來

  新增完成後,等個10來秒,一般就生效了,這時回到命令列介面,按下Enter鍵,檢查證照是否生成成功。certbot一般會將證照生成在/etc/letsencrypt/live/xxx.com/這樣的目錄下。

  獲取證照成功後,你可以使用下面的命令來嘗試更新證照:

$ sudo certbot renew --dry-run

  --dry-run表示只是執行命令,並不真正執行更新操作,如無意外,你會看到下面的出錯資訊:

Let's Encrypt - 免費SSL/TLS證照用起來

  不用慌,這是正常現象,回想我們生成證照的步驟,在最後一步的校驗中,需要我們在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 協議》,轉載必須註明作者和本文連結

相關文章