本文原文發表於我的技術博客 poseiden.top/posts/36547…,比同步於知乎專欄 - 個人三叉戟,歡迎關注。html
一直以來,對於HTTPS證書的概念都含糊不清,似懂非懂。緣由是本身以前比較懶,對於一些須要前置條件(買域名買證書等)才能玩的東西老是積極不起來(對!必定是窮)。而最近恰好有個項目須要配置HTTPS,也購買了域名(其實實踐時本身仍是買了域名),尤爲是知道了本文要介紹的「神器」 —— Let's Encrypt ,大大簡化了學習成本和時間。因此趁着一些碎片化的時間,研究了下證書的一些基本概念以及使用,總結下來,以供參考。另外,在我查找一些相關文檔的過程當中發現一個問題,就是因爲這方面知識的時效性不好,出現不少信息不對等的狀況,索性我將參考過的全部官網文檔連接貼在了最後,方便你們在看到這篇文章時,根據連接查看最新官方支持狀況。 (Let's Encrypt 如下簡稱 「LE」)python
首先說明的是,原本基於成本考慮,是沒有打算另購買一個域名來實踐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
搞清了關於證書方面的知識,那麼咱們接下來看看如何實踐。在客戶端方面,LE支持不少種不一樣的證書申請客戶端,官方推薦的爲Certbot,但值得注意的是,不管選擇哪一種客戶端,都必須支持 ACME的v2 版本,由於從2019年的11月開始,LE將 中止經過ACMEv1進行帳號註冊,計劃於2020年的6月開始將中止新域名的驗證。網絡
我的建議在實踐時使用更爲推薦的certbot-auto客戶端,在官方的解釋中,certbot-auto至關於certbot的wrapper,使用它能自動選擇最新版本的cerbot,對已有cerbot進行升級等操做。而且由於certbot運行時須要用到python環境,因此對應的依賴也能自動裝載到python的虛擬環境中。app
使用Certbot主要分兩部分,一部分爲申請獲取證書,另外一部分爲在基礎設置上安裝證書。而Cerbot自己支持不少插件來簡化這些操做。詳情見下表:dom
在申請證書的過程當中,LE須要對該域名的全部權進行驗證,而以上幾個插件都支持了 http-01 或 dns-01中的一種,亦或是同時支持兩種。不一樣的驗證方式會有不一樣的操做,這個後面會說。ide
好了,上面囉囉嗦嗦說了這麼多,下面能夠進入到實戰環節了。咱們以申請通配符證書爲例。工具
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
複製代碼
這裏幾個參數着重說一下:
*.domain.com
,而不是 domain.com
DNS plugins
dns-01
驗證方式返回的命令行輸出以下:
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
複製代碼
從這裏開始須要一些交互:
上步以後,命令行輸出以下:
-------------------------------------------------------------------------------
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申請的證書有效期通常都是爲三個月,因此到期後須要再次申請,網上相關自動化工具一抓一大把,就不在這裏贅述了。若是遇到問題,能夠繼續探討。