Let's Encrypt實踐指北

本文原文發表於我的技術博客 poseiden.top/posts/36547…,比同步於知乎專欄 - 個人三叉戟,歡迎關注。html

初衷

一直以來,對於HTTPS證書的概念都含糊不清,似懂非懂。緣由是本身以前比較懶,對於一些須要前置條件(買域名買證書等)才能玩的東西老是積極不起來(對!必定是窮)。而最近恰好有個項目須要配置HTTPS,也購買了域名(其實實踐時本身仍是買了域名),尤爲是知道了本文要介紹的「神器」 —— Let's Encrypt ,大大簡化了學習成本和時間。因此趁着一些碎片化的時間,研究了下證書的一些基本概念以及使用,總結下來,以供參考。另外,在我查找一些相關文檔的過程當中發現一個問題,就是因爲這方面知識的時效性不好,出現不少信息不對等的狀況,索性我將參考過的全部官網文檔連接貼在了最後,方便你們在看到這篇文章時,根據連接查看最新官方支持狀況。 (Let's Encrypt 如下簡稱 「LE」)python

Let's Encrypt

不支持IP綁定

首先說明的是,原本基於成本考慮,是沒有打算另購買一個域名來實踐HTTPS的,由於市面上的一些主流證書均可以既支持域名,又能夠支持公有IP。可是由LE官方論壇得知,目前只支持域名,並也沒有計劃支持公有IP。因此我就打消了這個念頭,轉而在阿里雲上單獨購買了一個域名。api

證書類型

如下介紹幾個關於證書類型的基本概念。 已知的LE如今支持三種證書類型。分別是 單域名證書SAN證書Wildcard證書。單域名證書,顧名思義,此證書只包含一個域名,屬於基本類型。SAN證書,一張證書能夠包含多個域名,早期用於多個子域名申請同一張證書的狀況。經實踐得知,此種證書在使用客戶端申請時最大的弊端須要一次性寫出全部的域名,對於後期擴展不太方便。最後一種是通配符證書,是本文詳細介紹的對象。此種證書類型是LE後期支持的,使用起來極大方便了小型開發團隊和我的開發者。好比針對.example.com這個域名,申請通配符證書(表達式爲*.example.com)後,凡是基於其的子域名,均可以使用這個證書。但爲了支持此特性,用於申請證書的客戶端也必需要支持ACME的V2版本。(官方推薦的Cerbot客戶端在0.22版本後)安全

須要注意的是,不管哪一種證書,根據LE的最新的中文官方文檔(2019年2月24日最後更新)所示,單張證書下最多可包含100個子域名,而每一個註冊域名(頂級域名)的證書數量是50張/每週,綜上所述,每週可爲5000個不一樣的子域名申請證書,且在2019年三月後,續期證書也算入域名證書數量內,對於我的或第三方獨立開發者的正常使用而言,這個支持量級是足夠的。bash

ACME 客戶端 —— Cerbot

搞清了關於證書方面的知識,那麼咱們接下來看看如何實踐。在客戶端方面,LE支持不少種不一樣的證書申請客戶端,官方推薦的爲Certbot,但值得注意的是,不管選擇哪一種客戶端,都必須支持 ACME的v2 版本,由於從2019年的11月開始,LE將 中止經過ACMEv1進行帳號註冊,計劃於2020年的6月開始將中止新域名的驗證。網絡

Certbot 的選擇

我的建議在實踐時使用更爲推薦的certbot-auto客戶端,在官方的解釋中,certbot-auto至關於certbot的wrapper,使用它能自動選擇最新版本的cerbot,對已有cerbot進行升級等操做。而且由於certbot運行時須要用到python環境,因此對應的依賴也能自動裝載到python的虛擬環境中。app

Certbot 插件選擇

使用Certbot主要分兩部分,一部分爲申請獲取證書,另外一部分爲在基礎設置上安裝證書。而Cerbot自己支持不少插件來簡化這些操做。詳情見下表:dom

在申請證書的過程當中,LE須要對該域名的全部權進行驗證,而以上幾個插件都支持了 http-01 或 dns-01中的一種,亦或是同時支持兩種。不一樣的驗證方式會有不一樣的操做,這個後面會說。ide

實踐

好了,上面囉囉嗦嗦說了這麼多,下面能夠進入到實戰環節了。咱們以申請通配符證書爲例。工具

安裝certbot-auto

cd ~
wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto
/usr/local/bin/certbot-auto --help
複製代碼

獲取證書

這裏背景是這樣的,因爲咱們須要申請通配符證書,LE官方FAQ指出只能經過 dns-01 的方式來驗證。插件選擇 manual,表示手動方式來配置。因此就有了如下這條命令。

certbot-auto certonly  
\ -d *.your_domain.com --manual --preferred-challenges dns 
\ --server https://acme-v02.api.letsencrypt.org/directory
複製代碼

這裏幾個參數着重說一下:

  • certonly: 表示使用certbot只用來申請獲取證書,而不作安裝操做。
  • -d: 域名。這裏注意,通配符證書必定配置爲 *.domain.com,而不是 domain.com
  • --manual: 手動模式,理論上也能夠選擇 DNS plugins
  • --preferred-challenges: 雖然manual模式下是同時支持兩種驗證方式的,而通配符證書須要採用 dns-01 驗證方式
  • --server: ACME v2 驗證使用的具體地址

返回的命令行輸出以下:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): your_email@gmail.com

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for your_domain.com

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y
複製代碼

從這裏開始須要一些交互:

  • 第一個:輸入聯繫人的email,方便之後接受更新證書提醒和安全提示的
  • 第二個:贊成條款
  • 第三個:記錄此IP爲申請證書的機器

DNS配置

上步以後,命令行輸出以下:

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.your_domain.com with the following value:

`一串base64編碼`

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
複製代碼

這時不要着急繼續,按照上述提示,須要去你的DNS服務提供商那裏手動配置一條記錄,用於驗證你對此域名的全部權。以Azure爲例,以下圖。

配置好以後,過一分鐘左右,利用dig命令查詢一下是否生效:

$ dig  -t txt  _acme-challenge.your_domain.com @8.8.8.8    

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.your_domain.com.        IN      TXT

;; ANSWER SECTION:
_acme-challenge.your_domain.com. 599 IN  TXT     "剛纔那串base64編碼"
複製代碼

這裏必定注意,有ANSWER SECTION纔算成功,我第一次配置錯了沒有出來這個,但也沒有注意到,因而敲回車鍵就掛掉了。不過你們在實踐中若是掛掉了也不要擔憂,從新執行命令便可。

成功

網絡沒什麼問題的話這步就應該已經成功了,輸出的信息會提示你證書生成的所在位置。不出意外的話應該在 /etc/letsencrypt/archive/your_domain.com 下。這裏值得注意的是,LE申請的證書有效期通常都是爲三個月,因此到期後須要再次申請,網上相關自動化工具一抓一大把,就不在這裏贅述了。若是遇到問題,能夠繼續探討。

Ref

相關文章
相關標籤/搜索