acme+cloudflare生成免費證書(自動續期)
acme DNSapi
acme DNSapi的作用是在申請證書時使用dns校驗,acme可以通過dnsapi在對應的dns管理平臺提交對應的dns記錄。玩過證書的朋友都知道,證書申請時有三種驗證方式
- 郵箱驗證:需要郵箱與域名綁定(細節要求我沒試過)
- 文件驗證:文件驗證時證書管理方會要求你在服務器的指定路徑上放一個指定文件(內容也是他們定),然后開放80端口,他們會去下載這個文件從而驗證你的身份。申請證書時你需要去你的服務器上操作,還要開放指定端口
- DNS驗證:DNS驗證只需要你在dns記錄上添加一條TXT記錄就可以
我們這里用到的就是DNS驗證,DNS驗證雖然方便,但是每次申請都需要添加一條DNS記錄(申請完成后可以刪除,acme好像自動幫忙刪除了),如果要實現自動化,acme需要有權限向dns記錄方提交記錄。
cloudflare DNSapi
根據上面的文檔可以看到cloudflare dns api 有兩種方式獲取
- 生成cloudflare的全局token(全局token擁有cloudflare的所有權限,大部分是acme用不到的)
- 生成cloudflare的DNS權限token(推薦,夠acme用的了)
生成cloudflare的DNS權限token
先來cloudflare的Api申請頁面

點擊這里的創建令牌
選擇編輯區域DNS 這個模板(一般來說是第一個)

按照下面的內容填寫

權限選 區域 -> DNS -> 編輯
區域資源 包括 -> 特定區域 -> 在下拉列表里選你的域名(你也可以在第二個框里面選擇所有區域)
剩下都不變,點繼續,跳轉到這個頁面

點擊生成令牌,就會產生一個令牌,令牌生成后第一時間記錄下來,這個令牌只顯示一次,刷新頁面后就看不到了
獲取cloudflare的用戶信息
點到cloudflare中對應的網頁管理頁面,在api的地方可以看到兩個ID

現在我們有三個信息
- 上面生成的一個管理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"
等他跑碼,會告訴你證書的位置

關鍵是上面兩行your cert, your cert key
上面生成的證書是 *.test.fun 的證書,所有的以test.fun結尾的域名都可以用這個證書
推薦的使用方案: 因為acme正常2個月會自動更新一下證書,所以我不推薦你把證書移動到別的位置,因為acme下次生成的時候還會放在這個位置,要么你指定acme的證書生成路徑,可以用
acme.sh --help查看怎么指定路徑。我使用的方法是(有兩個)
直接使用這個路徑
通過軟連接把證書鏈接過去
比如我要把證書放在/etc/nginx/ssl 里面 分別命名為
cert.crtpriv.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命令查看,我的結果是這樣的:

意思是每天凌晨3:28會檢查一下證書
如果你的證書是給nginx用的可以在root用戶下運行crontab -e 編輯root用戶的cron自動化命令
添加如下:
0 4 * * * systemctl reload nginx
表示每天4:00 重啟nginx ,因為nginx的證書需要重啟之后才能重載

浙公網安備 33010602011771號