使用 Docker CertBot 獲取 SSL 證書

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

本文做者: 蘇洋git

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


使用 Docker CertBot 獲取 SSL 證書

Let‘s Encrypt 在好久以前就開始了證書的免費申請,可是隨着 API 的升級、功能的增長,以前使用acme.sh 腳本就可以輕鬆獲取證書的操做,變得愈來愈麻煩,並且隨着配置項愈來愈多,瀏覽文檔很難快速瞭解到什麼纔是當前的最佳實踐。golang

原來的方案

在更新服務器操做系統以後,本來一直使用的 acme.sh 出現了問題:讀取不到我配置的 DNS 帳戶名稱,無論我是否直接將帳號寫入了執行腳本中。考慮到將來這套證書獲取客戶端還存在升級的狀況,繼續修改它顯然不是一個理智的選擇。算法

使用官方推薦的客戶端

雖然我使用的 Traefik 支持自動申請證書,可是一來我但願有更多的配置項,好比加密方案的選擇、好比證書單獨保存以備複用docker

二來在查看官方文檔以後,發現官方推薦了一套名爲 certbot 的客戶端,並提供了 Docker 鏡像,官方文檔編程

在翻閱文檔以後,咱們發現客戶端使用很簡單,只須要2條命令,幾個輸入確認就能夠了。看起來還不錯,那麼試試看吧。api

DNS 模式獲取證書

爲了保證解耦,我的使用無侵入的 DNS 模式,其實使用網站根目錄放置驗證文件也是同樣的。bash

官方提供了十幾種主流的 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈) 關於折騰羣入羣的那些事

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索