使用 Docker CertBot 獲取 SSL 證書

蘇洋發表於2018-09-18

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)

本文作者: 蘇洋

統計字數: 2655字 閱讀時間: 6分鐘閱讀 本文連結: soulteary.com/2018/08/30/…


使用 Docker CertBot 獲取 SSL 證書

Let‘s Encrypt 在很久之前就開始了證書的免費申請,但是隨著 API 的升級、功能的增加,之前使用acme.sh 指令碼就能夠輕鬆獲取證書的操作,變得越來越麻煩,而且隨著配置項越來越多,瀏覽文件很難快速瞭解到什麼才是當前的最佳實踐。

原來的方案

在更新伺服器作業系統之後,原本一直使用的 acme.sh 出現了問題:讀取不到我配置的 DNS 賬戶名稱,不管我是否直接將賬號寫入了執行指令碼中。考慮到未來這套證書獲取客戶端還存在升級的情況,繼續修改它顯然不是一個理智的選擇。

使用官方推薦的客戶端

雖然我使用的 Traefik 支援自動申請證書,但是一來我希望有更多的配置項,比如加密方案的選擇、比如證書單獨儲存以備複用

二來在檢視官方文件之後,發現官方推薦了一套名為 certbot 的客戶端,並提供了 Docker 映象,官方文件

在翻閱文件之後,我們發現客戶端使用很簡單,只需要2條命令,幾個輸入確認就可以了。看起來還不錯,那麼試試看吧。

DNS 模式獲取證書

為了保證解耦,個人使用無侵入的 DNS 模式,其實使用網站根目錄放置驗證檔案也是一樣的。

官方提供了十幾種主流的 DNS 服務商的映象,還提供了示例支援你自己進行封裝

這裡我選擇的是 cloudflare 這家服務商,所以對應的映象是 certbot/dns-cloudflare,你可以酌情修改。

因為使用 DNS 模式,需要提供 DNS 的驗證檔案(包含郵箱和私鑰),所以這裡需要先建立一個驗證檔案。

mkdir -p /data/letsencrypt/
touch /data/letsencrypt/cloudflare.ini
複製程式碼

然後在 cloudflare.ini 中寫入你的資料,比如:

# Cloudflare API credentials used by Certbot
dns_cloudflare_email = example@example.com
dns_cloudflare_api_key = e89af204ab0e06def9c0846c202d1dec40e80
複製程式碼

之後使用 Docker 的一次性執行模式啟動一個客戶端容器即可:

docker run -it --rm --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
            -v "/data/letsencrypt:/.secrets" \
            certbot/dns-cloudflare certonly \
            --dns-cloudflare-credentials /.secrets/cloudflare.ini \
            --dns-cloudflare-propagation-seconds 60 \
            --server https://acme-v02.api.letsencrypt.org/directory \
            -d soulteary.com -d '*.soulteary.com'
複製程式碼

如果你不需要籤萬用字元證書的話,那麼可以去掉 --server https://acme-v02.api.letsencrypt.org/directory 引數,另外,如果你的域名生效時間很長,可以考慮適當調大 --dns-cloudflare-propagation-seconds 60 中的等待時間(單位秒)。

執行指令碼之後,會問你幾個簡單的問題,依次是選擇申請證書的驗證方式(DNS記錄、臨時驗證Web服務、網站根目錄的靜態檔案),使用者協議是否同意,詢問你的郵箱,並分享給基金會,如果你沒有使用 -d 引數宣告要籤的網站域名還會詢問你網站域名是什麼。

如果一切順利,你的證書公鑰私鑰等檔案將會一家人整整齊齊的擺放在我們對映好的目錄:

/etc/letsencrypt/live
複製程式碼

通過檢視檔案目錄,可以得知,這裡存放的是最新申請到的證書的軟鏈。

lrwxrwxrwx 1 root root   37 Aug 30 12:49 cert.pem -> ../../archive/soulteary.com/cert1.pem
lrwxrwxrwx 1 root root   38 Aug 30 12:49 chain.pem -> ../../archive/soulteary.com/chain1.pem
lrwxrwxrwx 1 root root   42 Aug 30 12:49 fullchain.pem -> ../../archive/soulteary.com/fullchain1.pem
lrwxrwxrwx 1 root root   40 Aug 30 12:49 privkey.pem -> ../../archive/soulteary.com/privkey1.pem
複製程式碼

所以你大可不必擔心你更新證書失敗,連回滾的機會都沒有的情況。

至於如何更新、續簽證書呢,答案也很簡單,上面那段 docker run 申請命令,重新執行一遍即可,在輸入了域名之後,選擇 [renew] 即可。

當然,客戶端也提供了免互動的方案,把 docker run 映象後的引數修改為 renew 即可一次性續簽所有證書。

其他

其實也沒有太大必要去調整加密演算法,除非你要刻意相容特別老的裝置,使用預設配置即可。

加上 Traefik ,或者應該說 golang 已經支援了 CHACHA20_POLY1305文件),簽出來的證書,直接掛載到 Traefik 即可支援當前主流的所有裝置。

詳見下面的證書測試報告:

--EOF


我現在有一個小小的折騰群,裡面聚集了一些喜歡折騰的小夥伴。

在不發廣告的情況下,我們在裡面會一起聊聊軟體、HomeLab、程式設計上的一些問題,也會在群裡不定期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼新增好友。(請註明來源和目的,否則不會通過稽核) 關於折騰群入群的那些事

關於折騰群入群的那些事

相關文章