MIS 腳印

記錄 IT 學習的軌跡

Let’s Encrypt 免費 Wildcard 萬用字元憑證 SSL/TLS for CentOS 7

在 CentOS 7 透過 Certbot 軟體來申請 Let’s Encrypt 的萬用字元憑證 (Wildcard Certificates),就不用針對每個子網域申請一個對應的憑證,即可通用於所有子網域的網站。


Let’s Encrypt 已經開始支援萬用字元憑證 (Wildcard Certificates),因此當有多個子網域時,也只須申請一個憑證即可。

站長所架設的網站為 WordPress Multi User (簡稱為 WPMU) 多用戶 (詳細教學可參考建置 WordPress MU 多子網域 HTTPS for CentOS 7 + NGINX + PHP 7),可以直接於後台新增子網域的網站,之前 Let’s Encrypt 還沒有支援萬用字元憑證的時候,每新增一個子網域網站就必須申請一個對應的憑證,使用萬用字元憑證的方式後,即可通用於所有子網域的網站了,真是方便許多。

安裝軟體

Let’s Encrypt 憑證取得方式不同與其它網站是在網頁上手動填寫申請資料的,而是須在 Server 上安裝一個 Client(python 寫的),這種作法所帶來的好處是可全自動化,這裡使用 Let’s Encrypt 官方推薦的 Certbot Client,來自動取得、部署和更新 SSL 憑證:

首次安裝

安裝 EPEL 軟體擴充資源庫:

[root@img ~]# yum install epel-release

安裝 Certbot:

[root@img ~]# yum install certbot

升級

如果先前已安裝 Certbot,但要使用 Let’s Encrypt 萬用字元憑證,Certbot 的版本必須為 certbot 0.22.0 以上,先查看目前 certbot 版本:

[root@smalljacky ~]# certbot --version
certbot 0.23.0

如果不是 0.22.0 以上,就使用以下指令來更新所有軟體:

[root@smalljacky ~]# yum -y update

申請憑證

雖然萬用字元憑證可用於所有子網域,但如果與本站一樣是直接指定網域名稱的方式 (例如smalljacky.com 而不是 www.smalljacky.com),就必須多指定一個域名(僅須將 -d 選項後的二個網址更換為自己的):

[root@smalljacky ~]# certbot -d smalljacky.com -d *.smalljacky.com --manual --preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory

# 設定 Email (續約或安全性通知) 後 Enter
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):xxx@gmail.com

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

# 告知 IP 將會被記錄,輸人 Y 後 Enter
Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

-------------------------------------------------------------------------------
# 第一筆要新增的 DNS TXT (指令包含幾個 -d 指定的網址,就要設定幾筆)
Please deploy a DNS TXT record under the name
_acme-challenge.smalljacky.com with the following value:

tCUh9WTqckwKrxxxxxxxxxxxxxxxxxxxxKHjFfTfKhI

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
# 直接 Enter
Press Enter to Continue

# 第二筆要新增的 DNS TXT
Please deploy a DNS TXT record under the name
_acme-challenge.smalljacky.com with the following value:

fsGgQeEpA0kO0xxxxxxxxxxxxxxxxxxxxqYjnKhZvb4

Before continuing, verify the record is deployed.
# 先至代管 DNS 平台設定 DNS TXT 記錄,再使用下述的 host 指令確認兩筆記錄都有讀取到再 Enter
Press Enter to Continue

Waiting for verification...
Cleaning up challenges

# 建立完成
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
# 證書保存的位置
   /etc/letsencrypt/live/smalljacky.com-0001/fullchain.pem
   Your key file has been saved at:

# 密鑰保存的位置
   /etc/letsencrypt/live/smalljacky.com-0001/privkey.pem

# 證書到期日與如何使用指令來續訂證書方法
   Your cert will expire on 2018-08-14. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

設定 DNS TXT 記錄

各個代管 DNS 平台的設定方式都差不多,這裡使用 GoDaddy 說明,名稱只需設定 _acme-challenge 即可 .smalljacky.com 可省略。:

使用 host 指令確認 DNS TXT 記錄 (須先安裝包含 host 指令的 bind-utils 軟體):

[root@smalljacky ~]# yum install bind-utils
[root@smalljacky ~]# host -t txt _acme-challenge.smalljacky.com
_acme-challenge.smalljacky.com descriptive text "fsGgQeEpA0kO0YQsY6kb35h_qRhDQB6k-qYjnKhZvb4"
_acme-challenge.smalljacky.com descriptive text "tCUh9WTqckwKrf2f_9bXxquEMs0dcyUS0KHjFfTfKhI"

Web server 設定

Apache(httpd)、Nginx  須設定的證書與密鑰保存路徑如上,設定新的憑證後 Web server 必須重新啟動才會生效 (詳細教學可參考 CentOS 7 Let’s Encrypt 免費 SSL/TLS 憑證 HTTPS 設置 for NGINX)。

自動續期憑證

Let’s Encrypt 免費憑證有效期僅三個月,因此可使用建立憑證完成時所提示續訂證書指令的方式,來建立排程自動續期:

[root@smalljacky ~]# vi /etc/crontab
# 每月 1 日 03:00 續期憑證,並重啟 Nginx (使用 Apache 須將 nginx 替換成 httpd)
00 03  1  *  * root /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

參考


發表迴響