最近剛好有個項目需要配置HTTPS,也購買了域名,尤其在知道了本文要介紹的“神器” —— Let’s Encrypt 之後,大大簡化了學習成本和時間。
初衷
一直以來,對於HTTPS證書的概念都有些含糊不清,似懂非懂。原因是自己之前比較懶,對於一些需要前置條件(買域名買證書等)才能玩的東西總是積極不起來(對!一定是窮)。而最近剛好有個項目需要配置HTTPS,也購買了域名(實踐時自己還是買了域名),尤其在知道了本文要介紹的“神器” —— Let’s Encrypt 之後,大大簡化了學習成本和時間。趁着一些碎片化的時間,研究了證書的一些基本概念以及使用方法,總結下來,以供參考。另外,在我查找一些相關文檔的過程中發現一個問題,就是由於這方面知識的時效性很差,出現很多信息不對等的情況,索性我將參考過的所有官網文檔鏈接貼在了最後,方便大家在看到這篇文章時,根據鏈接查看最新官方支持情況。
( Let’s Encrypt 以下簡稱 “ LE ”)
Let’s Encrypt
不支持IP綁定
首先需要說明的是,本來基於成本考慮,是沒有打算再購買一個域名來實踐HTTPS的,因爲市面上的一些主流證書都可以既支持域名,又支持公有IP。但是由LE官方論壇得知,目前只支持域名,並沒有計劃支持公有IP。所以我就打消了這個念頭,轉而在阿里雲上單獨購買了一個域名。
證書類型
以下介紹幾個關於證書類型的基本概念。
已知的LE現在支持三種證書類型。分別是 單域名證書,SAN證書和Wildcard證書 。
- 單域名證書,顧名思義,此證書只包含一個域名,屬於基本類型。
- SAN證書,一張證書可以包含多個域名,早期用於多個子域名申請同一張證書的情況。經實踐得知,此種證書在使用客戶端申請時最大的弊端需要一次性寫出所有的域名,對於後期擴展不太方便。
- 最後一種是通配符證書,是本文詳細介紹的對象。此種證書類型是LE後期支持的,使用起來極大方便了小型開發團隊和個人開發者。比如針對
.example.com
這個域名,申請通配符證書(表達式爲*.example.com
)後,凡是基於它的子域名,都可以使用這個證書。但爲了支持此特性,用於申請證書的客戶端也必須要支持ACME的V2版本。(官方推薦的Cerbot客戶端在0.22版本後)
需要注意的是,無論哪種證書,根據LE的最新的中文官方文檔(2019年2月24日最後更新),單張證書下最多可包含100個子域名,而每個註冊域名(頂級域名)的證書數量是50張/每週,綜上所述,每週可爲5000個不同的子域名申請證書,且在2019年三月後,續期證書也算入域名證書數量內,對於個人或第三方獨立開發者的正常使用而言,這個支持量級是足夠的。
ACME 客戶端 —— Cerbot
搞清了證書方面的知識,我們接下來看看如何實踐。在客戶端方面,LE支持很多種不同的證書申請客戶端,官方推薦的是Certbot,但值得注意的是,無論選擇哪種客戶端,都必須支持 ACME的v2 版本,因爲從2019年的11月開始,LE將 停止通過ACMEv1進行賬號註冊 ,計劃於2020年的6月開始將停止新域名的驗證。
Certbot 的選擇
個人建議在實踐時使用更爲推薦的certbot-auto客戶端,在官方的解釋中,certbot-auto相當於certbot的wrapper,使用它能自動選擇最新版本的cerbot,對已有cerbot進行升級等操作。並且因爲certbot運行時需要用到python環境,所以對應的依賴也能自動裝載到python的虛擬環境中。
Certbot 插件選擇
使用Certbot主要分兩部分,一部分爲申請獲取證書,另一部分爲在基礎設置上安裝證書。而Cerbot本身支持很多插件來簡化這些操作。詳情見下表:
在申請證書的過程中,LE需要對該域名的所有權進行驗證,而以上幾個插件都支持了 http-01 或 dns-01中的一種,亦或是同時支持兩種。不同的驗證方式會有不同的操作,這個後面會說。
實踐
好了,上面囉囉嗦嗦說了這麼多,下面可以進入到實戰環節了。我們以申請通配符證書爲例。
安裝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): [email protected]
-------------------------------------------------------------------------------
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申請的證書有效期一般都是爲三個月,所以到期後需要再次申請,網上相關自動化工具一抓一大把,就不在這裏贅述了。如果遇到問題,可以繼續探討。
作者介紹:
朱海波,ThoughWorks高級顧問,架構師,主要聚焦於企業敏捷轉型,研發效能提升和人才培養等方面。爲國內外多家知名企業提供IT諮詢與和培訓服務,曾擔任架構師,技術負責人,工程師等角色。
本文轉載自ThoughtWorks洞見。
原文鏈接: