最近我在Freenom上申請了一個免費的網域:michael-studio.tk,而且也將現有網站的所有網址全都套用這一網域。至於SSL連線,原本我是採用「一個網站一組憑證」的方式,每個網站都有自己的SSL憑證。因為舊的網址是使用No-IP的,所以只能如此。現在已經有了自己專有的網域了,那麼在SSL憑證申請的方式上就多了一個選擇:Wildcard憑證。

我使用的是Let’s Encrypt的免費憑證,雖然效期只有短短的三個月,但是到期時是可以免費續期的。如果搭配Certbot這個程式,那麼在申請憑證與續期上就變得很簡單了(它可以自動幫你的憑證續期,可參考我之前發的這篇文章)。
對了,現在Certbot這個程式已經有Windows版本可用了,官方網站上也有完整的安裝與使用說明。

這一篇文章的內容主題是,如何使用Certbot申請於Freenom註冊的網域的Wildcard憑證。若是要申請單一網址的憑證,請參考前面所提及的文章。

繼續之前請注意:

  1. 本文當中我所使用的網頁伺服器軟體是Apache2,因此如果您是用Nginx或者其他種類的網頁伺服器軟體的話,這篇文章中可能不完全適用於您。不過申請Wildcard憑證部分,如果您也是註冊Freenom網域的話,也是可以參考的。
  2. 如果您是使用RHEL/CentOS 7及更新版本的話,與Apapche2網頁伺服器相關的systemctl操作指令中,請將apache2改成httpd,以免出錯

什麼是Wildcard憑證?

Wildcard憑證是在某一個網域下的所有網站都能使用的SSL憑證。舉個例子,如果你不只架了一個網站,還有架別的網站,甚或是架設FTP伺服器等可以使用SSL加密連線的伺服器,你就可以直接設定讓它們使用這一組憑證,不必再另外申請了(當然前提是你知道如何去設定,以及正確的參數該怎麼寫)。

以我自己架設的網站作為例子,這個部落格的網址是michael-blog.michael-studio.tk。除此之外我還有自己的SOHO工作室網站(網址:www.michael-studio.tk)、專門為YT頻道所設置的網站(msgv.michael-studio.tk)以及Nextcloud網路硬碟(nextcloud.michael-studio.tk)。這樣加起來我就有4個網站了,如果要一個網站一個憑證的話,我就得申請4組憑證給它們使用(這些都可以使用Certbot來完成);當然也可以用更簡單的方法:申請一組凡是michael-studio.tk網域下的網站都能使用的憑證(也就是這裡所說的Wildcard憑證),然後在個別網站下設定憑證參數就好了。

Certbot申請Wildcard憑證的方式-純手動

一開始我使用的Certbot是來自Ubuntu的軟體庫(現在用apt指令就可以安裝,舊版本需要先新增PPA來源),然而這個版本並不支援Freenom的DNS自動驗證。所以這時候我只能用手動的方式來進行網域驗證。流程部分可以參考這個網站

雖然我是成功使用這個方法申請到Wildcard憑證了,但是…屆時要續期的話,是不能使用certbot renew指令來進行的(除非有安裝相應的DNS外掛,底下會講),只能整個申請流程重新做一次。很麻煩對吧?

沒錯,但如果有安裝相應的DNS外掛的話,這些申請流程就可以完全讓Certbot全權處理,完全不需要親自介入。不過問題就在這裡:Ubuntu軟體庫的Certbot並沒有收錄freenom的DNS外掛。唯一可用的就是使用pip3指令來安裝(因為Ubuntu 20.04之後的版本要用pip3,它已經不支援pip了):

pip3 install certbot-dns-freenom

使用這個指令就可以安裝freenom的DNS外掛了,但是它無法搭配Ubuntu軟體庫的Certbot運作(因為外掛要求的Certbot版本遠高於軟體庫的Certbot版本),於是…

沒錯,後來我就乾脆直接改用pip3來安裝Certbot跟這個外掛,而且申請過程都很順利,除了一開始有出些小錯誤。當然,為了讓舊有的No-IP網址也可以正確轉向到新網域,它們的SSL憑證也必須申請。這時候我要裝的是Certbot的apache外掛(一樣要用pip3安裝),但是在這過程中發生了點問題…不過這個問題已經解決了,外掛也順利安裝,新舊網址的憑證全部搞定也能正常續期。至此網站的SSL連線全部完成建置。

Certbot搭配Freenom DNS外掛來申請SSL憑證

以下步驟中之所以要安裝certbot-apache,是因為我要用它來申請No-IP網址的憑證(同時用來自動產生設定參數,作為michael-studio.tk網域設定SSL時參考使用);michael-studio.tk網域部分的憑證是直接用DNS外掛申請的,申請之後再自行修改網站設定檔以使用該憑證
現在已經完全使用自己付費註冊的網域,故已不使用No-IP

(註:新版Freenom DNS外掛有對部分參數做修改,並附上使用nginx時的步驟)

  1. 首先,使用pip3來安裝certbot與certbot-dns-freenom這兩個項目
    如果此前有使用apt來安裝Certbot的話,請使用apt-get purge或apt remove –purge(Ubuntu/Debian)或yum/dnf remove(CentOS/Alma Linux/Rocky Linux等)任一指令來將其徹底移除(同時會將設定檔刪除),以免造成後續問題
  2. (Apache需要)接著使用apt來安裝python3的augeas外掛(否則稍後使用pip3安裝certbot-apache會失敗),指令:sudo apt install python3-augeas
  3. 使用pip3安裝certbot-apache
  4. 申請No-IP網址的憑證(使用apache外掛)
  5. 建立一個credentials.ini檔案,將你的Freenom登入帳號與密碼寫進去,格式如下:
    dns_freenom_username = 你的Freenom帳號
    dns_freenom_password = 你的Freenom密碼

    如果你跟我一樣,當初註冊Freenom時是使用社群帳號登入(也就是使用如Google、Facebook等帳號登入)的話,必須先到登入頁面點選下圖的”Request a Password Reset”連結,然後輸入對應的電子郵件地址並送出,稍後就會收到包含密碼重設連結的信。點選裡面的連結就可以重設密碼了。

  6. 然後輸入下面這些指令(取自certbot-dns-freenom的Github頁面):
    certbot certonly -a dns-freenom \
      --dns-freenom-credentials credentials.ini檔案位置 \
      --dns-freenom-propagation-seconds 330 \
      -d "網域名稱" \
      -m 你的電子郵件地址 \
      --agree-tos -n

    這裡我再額外做幾個補充:

    1. –dns-freenom-credentials參數是指定在步驟5中建立的credentials.ini檔案位置,實際操作時我是將它存放在系統的/etc目錄下,並設置權限為600(僅擁有者可讀寫,其他人不可存取,詳細原理可參考鳥哥的Linux私房菜網站)
    2. –dns-freenom-propagation-seconds 330:這是在進行DNS驗證時的等待秒數,Github頁面上的範例是300秒,我實作時發現有時候會驗證失敗,於是我就按照網頁說明,將這個秒數增加30秒,之後就不會有問題了。
      原理:因為Certbot在申請Wildcard憑證時需要對申請網域做DNS驗證,要驗證的話就必須在DNS紀錄中新增一筆TXT紀錄(驗證完成時會自動刪除);而DNS紀錄從完成新增到生效是需要一定時間的(以上指令所新增的DNS紀錄約需要過5分鐘後才會生效),所以才需要設定這一等待時間。
      然後當Certbot進行DNS查詢時,如果查到指定網域下確實存在一筆有特定內容的TXT紀錄,那就表示你擁有這個網域的控制權,也就通過驗證了。
    3. -d “網域名稱”:這裡要輸入的是”*.註冊的網域名稱”。例如註冊的網域是example.tk,這裡就輸入*.example.tk。請依照實際註冊的網域名稱輸入
    4. 除最後一行外,每行行尾的\是換行標記,是讓你在輸入指令時可以換行輸入
  7. 確定申請成功之後,執行sudo certbot renew –dry-run指令,測試憑證能否自動續期。續期時會自動套用申請時的參數,不需要另外指定參數。
  8. 將相關憑證檔位置、私鑰檔等參數寫入Apache的網站設定檔中,最後執行sudo systemctl reload apache2(CentOS/RHEL等為httpd)
    如果有使用apache外掛申請憑證的話,Certbot會自動產生一個SSL設定檔,這個也要包含進去喔(修改後一樣要執行上面的指令才會生效)

    若是nginx的話,檔名為options-ssl-nginx.conf,另外還有ssl-dhparams.pem這個檔案。
  9. 在/etc/crontab中設定certbot的續約排程,週期我自己是每月執行一次。
    除此之外也可以使用systemd設定排程(分別寫一個timer單元與service單元,分別用於排程與實際執行指令),效果與c在ron下設定一樣,但可以檢視執行紀錄,有問題時方便排查。

這樣子就完成了Freenom網域的Wildcard SSL憑證的申請了。正在看這篇文章的你如果想知道效果的話,可以點一下網址列前面的鎖頭圖示,看一下憑證資訊,你就知道了。

如果你不想要輸入那麼一長串指令的話也沒關係,我有用bash寫了一個指令檔,讓你可以直接按照指示輸入必要內容,完成申請wildcard SSL憑證。
為避免執行時發生顯示亂碼的狀況,這個指令檔顯示的訊息我已經改成英文。要改成中文訊息的話也不是不可以,只是並非每個人都知道怎麼讓Linux在文字介面下也能顯示中文(以SSH連線的情況下,tty下是不可能的),因此我覺得放英文版比較不會有問題(起碼英文還可以查字典什麼的,亂碼能知其所云?別鬧了)。

指令檔下載:https://nextcloud.michael-studio.tk/index.php/s/B8ykFaCa32YN3sG
也許未來我會考慮註冊Github帳號,然後把指令檔放到上面去,會更方便一些。

歡迎留言~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料