acme+cloudflare生成免費證書(自動續期)

bighu發表於2024-09-23

acme DNSapi

acme DNSapi的作用是在申請證書時使用dns校驗,acme可以透過dnsapi在對應的dns管理平臺提交對應的dns記錄。玩過證書的朋友都知道,證書申請時有三種驗證方式

  • 郵箱驗證:需要郵箱與域名繫結(細節要求我沒試過)
  • 檔案驗證:檔案驗證時證書管理方會要求你在伺服器的指定路徑上放一個指定檔案(內容也是他們定),然後開放80埠,他們會去下載這個檔案從而驗證你的身份。申請證書時你需要去你的伺服器上操作,還要開放指定埠
  • DNS驗證:DNS驗證只需要你在dns記錄上新增一條TXT記錄就可以

我們這裡用到的就是DNS驗證,DNS驗證雖然方便,但是每次申請都需要新增一條DNS記錄(申請完成後可以刪除,acme好像自動幫忙刪除了),如果要實現自動化,acme需要有許可權向dns記錄方提交記錄。

cloudflare DNSapi

acme dns api doce

根據上面的文件可以看到cloudflare dns api 有兩種方式獲取

  • 生成cloudflare的全域性token(全域性token擁有cloudflare的所有許可權,大部分是acme用不到的)
  • 生成cloudflare的DNS許可權token(推薦,夠acme用的了)

生成cloudflare的DNS許可權token

先來cloudflare的Api申請頁面

image-20240923085901516

點選這裡的建立令牌

選擇編輯區域DNS 這個模板(一般來說是第一個)

image-20240923085941855

按照下面的內容填寫

image-20240923090119372

許可權選 區域 -> DNS -> 編輯

區域資源 包括 -> 特定區域 -> 在下拉選單裡選你的域名(你也可以在第二個框裡面選擇所有區域

剩下都不變,點繼續,跳轉到這個頁面

image-20240923090358443

點選生成令牌,就會產生一個令牌,令牌生成後第一時間記錄下來,這個令牌只顯示一次,重新整理頁面後就看不到了

獲取cloudflare的使用者資訊

點到cloudflare中對應的網頁管理頁面,在api的地方可以看到兩個ID

image-20240923090719587

現在我們有三個資訊

  • 上面生成的一個管理DNS的TOKEN
  • 這裡的區域ID
  • 這裡的賬戶ID

在對應伺服器上生成證書

設定環境變數

export CF_Token="填DNS token"
export CF_Zone_ID="填區域ID"
export CF_Account_ID="填賬戶ID"

安裝acme

 apt update -y          #更新系統

 apt install -y curl    #安裝curl

 apt install -y socat    #安裝socat

 curl https://get.acme.sh | sh

生成證書

acme.sh --issue --dns dns_cf -d test.fun -d "*.test.fun"

如果說找不到acme.sh,可以使用下面的命令

~/.acme.sh/acme.sh --issue --dns dns_cf -d test.fun -d "*.test.fun"

等他跑碼,會告訴你證書的位置

image-20240923092443069

關鍵是上面兩行your cert, your cert key

上面生成的證書是 *.test.fun 的證書,所有的以test.fun結尾的域名都可以用這個證書

推薦的使用方案: 因為acme正常2個月會自動更新一下證書,所以我不推薦你把證書移動到別的位置,因為acme下次生成的時候還會放在這個位置,要麼你指定acme的證書生成路徑,可以用acme.sh --help 檢視怎麼指定路徑。我使用的方法是(有兩個)

  • 直接使用這個路徑

  • 透過軟連線把證書連結過去

    比如我要把證書放在/etc/nginx/ssl 裡面 分別命名為cert.crt priv.key我可以這樣做

    cd /etc/naginx/ssl
    ln -s /home/ivhu/.acme.sh/證書路徑.cer  cert.crt
    ln -s /home/ivhu/acme.sh/證書私鑰.key priv.key
    

證書生成後一般會新建一個cron 的定時認為用來維護證書保證期

可以透過 crontab -e命令檢視,我的結果是這樣的:

image-20240923091717497

意思是每天凌晨3:28會檢查一下證書

如果你的證書是給nginx用的可以在root使用者下執行crontab -e 編輯root使用者的cron自動化命令

新增如下:

0 4 * * * systemctl reload nginx

表示每天4:00 重啟nginx ,因為nginx的證書需要重啟之後才能過載

相關文章