Acme自動更新萬用SSL憑證

February 25, 20242 分鐘

Acme自動更新萬用SSL憑證

本篇教學會使用Let's Encrypt認證機構來取得SSL憑證

設備環境

  • Ubuntu 20.04 (只要是Linux環境都可以)
  • Nginx網頁伺服器 (其他的也行,但是要自行改指令)
  • Cloudflare

說明

本篇教學會使用Let’s Encrypt認證機構來取得SSL憑證,Let’s Encrypt是由多家公司與非營利組織共同創建的數位憑證機構,其目標是讓所有使用者的網站都能免費申請以及自動化取得認證憑證。我原本直接使用Certbot就可以認證網域所有人了,但是2024/02/24買了新網域就發生奇奇怪怪的事,導致DNS一直出現錯誤。於是爬文找到ACME自動化申請認證。

ACME安裝教學

1.切換成root權限

sudo su - root

2.將系統套件更新至最新版本

sudo apt update && sudo apt upgrade -y

3.安裝ACME軟體,ACME是存放在Github上的開源軟體。

注意:請把命令欄的[email protected]更改成您自己的信箱。

git clone https://github.com/acmesh-official/acme.sh.git

cd acme.sh

./acme.sh --install -m [email protected]

source ~/.bashrc

cd

4.2021年8月1日ACME新版本3.0開始改成使用ZeroSSL認證,建議不熟悉操作的夥伴改回Let’s Encrypt

acme.sh --set-default-ca --server letsencrypt

5.檢查是否安裝好ACME

acme.sh --version

DNS API取得教學

Let’s Encrypt提供不同的驗證方式,分別是DNS、HTTP、TLS-ALPN,這些認證方式僅DNS支援萬用憑證,所以我們只能選擇DNS來進行認證。
ACME支援的DNS服務商API,我將使用Cloudflare作為示範。

1.前往Cloudflare個人API頁面 01 2.選取「編輯區域DNS」 02 3.有上到下分別是Token名稱、權限、區域範圍,請設定成跟下圖一樣就可以了,「區域選擇」後面要選擇自己的域名。設定完畢後點擊「繼續至摘要」。 03 4.確認無誤就點選「建立Token」 04 5.複製TokenAPI並且使用指令將變數儲存到電腦。

export CF_Token="你的TokenAPI"

6.前往設定的域名>概觀,往下滑查看左側的API訊息 05 06 7.填寫並儲存變數。

變數名稱跟API要相互對應!

export CF_Zone_ID="區域識別碼API"
export CF_Account_ID="帳戶識別碼API"

申請SSL憑證

因為我是使用Nginx網頁伺服器,Nginx支援雙憑證,所以就直接將RSA跟ECC一起簽。反正兩張憑證一起放,如果兩張都支援,伺服器會優先使用ECC憑證,不支援ECC的話就自動使用RSA憑證。

RSAECC
相容性
金鑰長度
安全性

Let’s Encrypt申請憑證有一些速率限制,請不要過度頻繁申請喔。

請把 example.com改成自己的域名,「*」符號是用來告訴憑證是萬用域名的,請不要刪除,除非你知道你在做什麼。

範例: *.example.com » *.sunofficial.top

1.使用ACME註冊RSA憑證

acme.sh --issue --dns dns_cf --server letsencrypt -d *.example.com -k 4096

2.使用ACME註冊ECC/ECDSA憑證

acme.sh --issue --dns dns_cf --server letsencrypt -d *.example.com -k ec-384

憑證申請成功後,會存放在ACME資料夾,但是擔心未來更新ACME核心時,有可能將認證變動,所以這裡要將憑證複製到新地方。

複製憑證

1.新增兩個資料夾目錄分別存放RSA、ECC。

#創建RSA資料夾
sudo mkdir -p /etc/letsencrypt/cert

#創建ECC/ECDSA資料夾
sudo mkdir -p /etc/letsencrypt/cert/ecc

2.將憑證複製到資料夾。

指令中的「*」符號請保留,請更換域名就好。

#複製RSA
acme.sh --install-cert -d *.example.com \
--cert-file /etc/letsencrypt/cert/cert.pem \
--key-file /etc/letsencrypt/cert/private.key \
--fullchain-file /etc/letsencrypt/cert/fullchain.pem \
--ca-file /etc/letsencrypt/cert/chain.pem

#複製ECC/ECDSA
acme.sh --install-cert -d *.example.com --ecc \
--cert-file /etc/letsencrypt/cert/ecc/cert.pem \
--key-file /etc/letsencrypt/cert/ecc/private.key \
--fullchain-file /etc/letsencrypt/cert/ecc/fullchain.pem

3.將ACME設定成自動更新。

acme.sh --upgrade --auto-upgrade

設定Nginx伺服器

1.編輯Nginx檔案(Nginx設定檔名稱自己決定)。

sudo nano /etc/nginx/sites-available/設定檔名稱

2.進入Nano編輯器後輸入以下字串。
example.com改成你自己要的域名(總共有2處要更改)。

#HTTP轉HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}
#伺服器設定,請自行把"root /var/www/html"更換成你自己網頁的根目錄
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;
    root /var/www/html;
    #RSA
    ssl_certificate /etc/letsencrypt/cert/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/cert/private.key;
    #ECC/ECDSA
    ssl_certificate /etc/letsencrypt/cert/ecc/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/cert/ecc/private.key;
    ssl_ecdh_curve X25519:secp384r1;
    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1440m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/cert/example.com/chain.pem;
    add_header Strict-Transport-Security "max-age=31536000; preload";

    # ...

}

3.測試Nginx設定檔是否有誤

sudo nginx -t

如果看到以下訊息,代表設定都完成了。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

4.重新載入Nginx設定檔

sudo systemctl restart nginx

5.去瀏覽器輸入你的網域就可以訪問了!

如果想知道自己的網域是否有配置完全,可以前往SSL Server Test進行檢測。

其他ACME指令(不需要閱讀)

  • 更改ACME安裝時輸入的電子郵箱:
acme.sh --register-account -m 電子郵箱
  • 手動強制更新憑證:
acme.sh --cron -f
  • 停止續約域名:
#RSA
acme.sh --remove -d 域名

#ECC
acme.sh --remove -d 域名 --ecc
  • 關閉ACME自動更新:
acme.sh --upgrade --auto-upgrade 0
  • 移除ACME:
acme.sh --upgrade
acme.sh --uninstall
rm -r ~/.acme.sh