「若是能把 SSL 證書附加在域名上,那該多酷啊!」 —— 凱麗html
Certbot 是 Let's Encrypt 的官方工具。nginx
本文主要介紹如何使用 Let's Encrypt 的 Certbot 工具免費生成、修改、更新和撤銷 SSL 證書。web
簡略介紹一點證書的配置。面試
本文沒有說起泛域名證書的生成。apache
要求網站已經正確配置了服務器、DNS 等,已經可以正常訪問。bash
本文操做環境爲 Ubuntu。服務器
可部分參照官網。
在官網首頁,選擇服務器和操做系統後,會給出相應的安裝以及生成證書的命令。app
這裏只看安裝的部分:dom
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
複製代碼
查看是否安裝成功:ide
certbot --version
複製代碼
或
letsencrypt --version
複製代碼
輸出的都是 certbot 的版本號:
certbot 0.25.0
複製代碼
重要:在開始以前,先看一下本文末尾關於頻率限制的說明。
在前一節裏,官網給出安裝命令後,也給出了生成證書的命令,好比:
爲 Nginx 服務器生成:
sudo certbot --nginx
複製代碼
爲 Apache 服務器生成:
sudo certbot --apache
複製代碼
在生成證書後,能夠選擇讓 certbot 自動修改對應服務器軟件的配置文件,包括將 80
端口的請求重定向至 443
,啓用相應模塊,激活配置文件等。
自動修改後配置文件的寫法是值得參考一下的。
可是!爲了更深刻地瞭解 Let's Encrypt,也爲了可以更靈活地操做證書,咱們不採用這種快捷方式。而是僅僅生成證書,並手動配置。
方法有 standalone
和 webroot
兩種。
不管哪一種方式,certbot 都須要驗證域名,可是實現的方式不一樣,這也是二者有區別的根本緣由。
standalone
方法生成和更新證書的時候,certbot 須要使用 443 或者 80 端口來驗證域名,所以致使須要暫時中止服務器。這種方式不須要給出網站根目錄webroot
方法沒有上述問題。不過 webroot
方法配置略微複雜,而且須要給出網站根目錄webroot
方式之因此不須要 80
或 443
端口,是由於它的實現方式是,在網站根目錄中生成一個臨時子目錄 .well-known/acme-challenge
,而後從 certbot 的服務器向這個路徑發送請求,若是請求成功,那麼驗證經過。
這篇文章簡單介紹了幾個 webroot 模式可能會遇到的問題。
基本命令爲:
sudo letsencrypt certonly --standalone
複製代碼
須要使用 80
或 443
端口,能夠經過 --preferred-challenges
指定要使用的端口,只要其中一個端口空閒就能夠。
可是說實話,難道存在其中一個端口是空閒的狀況嗎
使用 80
端口:
--preferred-challenges http
複製代碼
使用 443
端口:
--preferred-challenges tls-sni
複製代碼
使用 -d
指定要生成證書的域名。能夠添加多個域名,使用逗號分隔,或者使用多個 -d
。兩種方法效果相同。
多個域名時,同一個主域名下的多個子域名是能夠的,沒有試過多個不一樣的主域名是什麼效果。
執行生成命令:
sudo letsencrypt certonly --standalone -d example.com,www.example.com
複製代碼
第一次使用時,會詢問郵箱、是否贊成服務條款、是否接受推送內容。
推薦如實填寫郵箱,由於證書即將過時時會經過郵件通知。
推送內容不接受就行了。
證書即將過時的通知郵件:
感受這個通知不太準,不少次收到郵件,可是登陸查看了一下並無。
也(很)多是由於當時沒用
--staging
致使生成了不少證書...
2019年4月26日更新:
媽的今天面試演示項目的時候證書過時。。
回來一看有過郵件通知,可是沒在乎。。這是一個狼來了的故事
若是看到如下信息說明證書生成成功:
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2018-09-25. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 複製代碼
可使用 certbot certificates
命令查看當前證書的信息:
Found the following certs:
Certificate Name: example.com
Domains: example.com, www.example.com
Expiry Date: 2018-09-26 00:42:47+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
複製代碼
能夠看到,生成了1個證書,-d
後面的第一個域名爲證書名和所在目錄的目錄名,該證書包含了兩個域名 example.com
和 www.example.com
。
這些域名均可以使用該證書。
共生成了四個文件:
/etc/letsencrypt/archive/example.com
目錄保存原件。
/etc/letsencrypt/live/example.com
目錄保存文件的軟連接,能夠理解爲快捷方式。
live/
中的文件貌似不僅是原件的軟連接那麼簡單,可是沒有仔細研究。
privkey.pem 爲私鑰,務必妥善保管。
這種方式須要給出網站根目錄做爲參數。從這名字 webroot
應該也能看出來。
基本命令:
certbot certonly --webroot -w /path/to/webroot -d www.example.com -d example.com
複製代碼
其中,-w
是網站的根目錄,-d
是要生成證書的域名。
注意,-d
列出的域名的根路徑必須所有與 -w
的值相同。
若是要爲根路徑不一樣的多個域名生成證書,那麼只須要在後面再添加 -w
及其對應的 -d
便可:
certbot certonly --webroot -w /path/to/webroot1 -d www.example.com -d example.com -w /path/to/webroot2 -d other.example.net -d another.other.example.net
複製代碼
其餘內容再也不贅述,參考前面 standalone
部分。
從 0.22.0
版本開始,Let's Encrypt 支持生成泛域名證書。
TODO
以 Apache 和 Nginx 爲例。這裏只介紹一下最基本的配置。
首先,這裏是官方文檔給出的上面生成的4個文件與服務器配置項的對應關係。
# apache < 2.4.8
SSLCertificateKeyFile privkey.pem
SSLCertificateFile cert.pem
SSLCertificateChainFile chain.pem
複製代碼
# apache >= 2.4.8
SSLCertificateKeyFile privkey.pem
SSLCertificateFile fullchain.pem
複製代碼
官方文檔是這麼寫的,可是如今最新版本才2.4.3,哪來的2.4.8?
啓用 SSL 模塊:
a2enmod ssl
複製代碼
修改配置文件:
<VirtualHost *:443>
ServerName example.com
SSLCertificateKeyFile privkey.pem
# apache < 2.4.8
SSLCertificateFile cert.pem
SSLCertificateChainFile chain.pem
# apache >= 2.4.8
SSLCertificateFile fullchain.pem
...
</VirtualHost>
複製代碼
重啓 Apache:
service apache2 restart
複製代碼
ssl_certificate_key privkey.pem;
ssl_certificate fullchain.pem;
複製代碼
修改配置文件:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate fullchain.pem;
ssl_certificate_key privkey.pem;
...
}
複製代碼
重啓服務器:
service nginx restart
複製代碼
更進一步的配置:《分享一個 HTTPS A+ 的 nginx 配置》
上面使用 standalone
方法已經生成了域名 example.com
和 www.example.com
的證書,證書名爲 example.com
。
若是如今又要爲 a.example.com
生成證書,那麼能夠生成一張新的證書,也能夠選擇添加到現有的證書 example.com
裏。
certbot 官方文檔提供了簡單的示例:
certbot --expand -d existing.com -d example.com -d newdomain.com
複製代碼
雖然示例使用了 --expand
選項,可是後面推薦使用的是 --cert-name
,由於 --expand
只能用來添加域名,而 --cert-name
更靈活,既能夠添加也能夠刪除。
官方文檔沒有提供 --cert-name
的示例,下面介紹一下。
命令的大體結構是:
certbot certonly --cert-name certname -d a.domain.com,b.domain.com
複製代碼
--cert-name
選項的參數是現有證書的證書名,-d
選項的參數是證書包含的域名。
注意,多個域名用逗號分隔,而且中間不能有空格。
即,不能是:
-d a.domain.com, b.domain.com
,而應該是-d a.domain.com,b.domain.com
。
如今開始爲證書名爲 example.com
、包含 example.com
和 www.example.com
兩個域名的證書添加一個新的域名 a.example.com
。
certbot certonly --cert-name example.com -d example.com,www.example.com,a.example.com
複製代碼
會出現提示:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
複製代碼
選擇 1
。或者在命令中添加 --standalone
選項,能夠跳過這一步。
Plugins selected: Authenticator standalone, Installer None
-------------------------------------------------------------------------------
You are updating certificate example.com to include new domain(s):
+ a.example.com
You are also removing previously included domain(s):
(None)
Did you intend to make this change?
-------------------------------------------------------------------------------
(U)pdate cert/(C)ancel:
複製代碼
選擇 u
,執行更新便可。
如今證書中包含了三個域名,若是要從中刪除域名www.example.com
,執行的命令爲:
certbot certonly --cert-name example.com -d example.com,a.example.com
複製代碼
想要刪除的域名,不在 -d
後列出來便可。
能夠發現,上面在修改由 standalone
方式生成的證書時,仍然能夠選擇 standalone
和 webroot
。
那麼看來證書的生成方式是能夠改變的。
可是沒有試過,感興趣的同窗能夠試一下。
從證書信息中能夠看到,證書有效期爲90天。在證書到期前須要進行更新。
能夠手動進行更新:
certbot renew
複製代碼
根據 certbot 官方文檔,該命令只會更新30天內即將過時的證書。對其餘的證書沒有影響。
證書更新可使用 crontab 等設置計劃任務實現自動更新,好比天天執行一次 renew
命令。
可是注意,由 standalone
方法生成的證書,更新時也須要使用 80
或 443
端口,所以可能須要(不如說必定須要)在執行 renew
前先關閉服務器,結束後再從新開啓。
使用 revoke
選項:
sudo certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem
複製代碼
前面說過,archive
目錄保存了證書原件,live
目錄保存了證書的軟連接。
這裏的路徑只能是 live
,不能是 archive
,不然會報錯。
撤銷成功後,會詢問是否刪除證書文件和證書所在目錄:
-------------------------------------------------------------------------------
Would you like to delete the cert(s) you just revoked?
-------------------------------------------------------------------------------
(Y)es (recommended)/(N)o:
複製代碼
推薦選擇 Yes
自動刪除。若是選擇 No
,以後須要執行 certbot delete
來刪除文件。
根據 certbot 官方文檔,不管自動仍是手動,最後都須要把相關文件刪掉。
若是沒有刪除,那麼 archive
和 live
兩個目錄及其中的文件就仍然存在。執行 certbot certificates
仍然能顯示該證書的信息,不事後面會註明已經失效 INVALID
。可是,在執行證書更新的時候,已經撤銷的證書還會被更新。
Staging Environment - Let's Encrypt 官方文檔
Let's Encrypt 爲證書申請的頻率作了限制,每一個主域名每週不超過20次。
若是達到這個 rate limits,不可以再繼續生成了,會報錯。
因此若是隻是爲了學習和測試,最好使用 Let's Encrypt 提供的 Staging Environment(模擬環境),沒有頻率限制。
只要在執行命令時加上 --staging
選項就能夠了。
等會用了再玩真的。
百度 LAVAS 項目中關於 HTTPS 的介紹:使用 HTTPS,寫得挺好的。
個人其餘文章: