ACME Client自動申請憑證(docker搭配ACME container daemon走 standalone模式)
---
> 不想在系統上安裝ACME帶來的套件,
> 利用docker版本來產生憑證。
> 本篇採用standalone模式的分享,
> 使用此模式不用額外架設驗證需要的http 80埠服務。
### 環境準備與條件
1. 防火牆設置port forwarding 將實體IP位址的80埠到運行的主機IP的80埠。
2. 要申請的domain要指向運行上述的外部IP,在自動簽發過程let's encrypt才能正確驗證。
3. 運行的主機不得有已經占用的80 port服務。
4. 主機要有安裝docker是必要條件,若沒有請參照官方說明。
說明:
standalone模式,會在自動申請憑證過程,短暫的建立http服務,
來完成驗證程序,在驗證完成後馬上就會關閉,不用擔心常開被攻擊的疑慮。
### 執行範例
> 示範執行方式,最終會產生憑證,
> 平常可以透過排程定期檢查更新憑證,
> 如果到期會自動執行產生新的憑證,
> 至於怎麼自動化放到自己的環境,
> 依照自己環境做設計。
##### 建立工作目錄並切換到該目錄
mkdir -p acme/out
cd acme
##### 取得 acme 以及執行 acme container daemon 模式
> container把out掛載到實體目錄,方便整合、重複建立container或取用。
docker pull neilpang/acme.sh
docker run -d -v "$(pwd)/out":/acme.sh -p 80:80 --name=acme.sh neilpang/acme.sh daemon
##### 初始操作
#將服務改成 letsencrypt
docker exec -it acme.sh --set-default-ca --server letsencrypt
#版本更新
docker exec -it acme.sh --upgrade
#註冊
docker exec -it acme.sh --register-account -m 你的mail address
##### 簽發憑證
> 因為很窮,所以平常用 duckdns.org 的免費網域做示範教學
> 所以沒有可以www起頭
#執行自動產憑證
docker exec -it acme.sh --issue -d mydowmin.duckdns.org --standalone
# 假設起頭說的條件都有完成,自動簽發的過程基本上是順利的
完成之後會在out/mydowmin.duckdns.org_ecc下產生 fullchain.cer 跟mydowmin.duckdns.org.key,
就可以拿去nginx去做測試套用在https憑證上。**注意 out 目錄內容之後不要刪除**。
##### 自動更新憑證
> 執行更新指令的時候,如果沒到期,他什麼都不會做,只會顯示憑證尚未到期,到期日是哪天。
docker exec -it acme.sh --renew -d mydomain.duckdns.org --standalone
##### 策略設計
平常可以把更新憑證寫script設計流程,並作為排程定期運行,
每次執行後,可以檢查正式nginx上的憑證跟out下的有沒有一致,
如果不一致代表更新了,就更名備份舊憑證然後再把新的放上去,
然後reload或restart nginx服務。
如果沒辦法自己做到設計script就求助GPT寫script或者自己人工去換吧。
或許也可以將產生路徑跟nginx讀取憑證路徑做整合,也是可以減少額外的設計。
本篇主旨在於對系統做其他安裝,在docker container下產生憑證。