你的網站還沒用上 HTTPS 嗎

前言

「若是能把 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,也爲了可以更靈活地操做證書,咱們不採用這種快捷方式。而是僅僅生成證書,並手動配置。

方法有 standalonewebroot 兩種。

standalone 與 webroot 的區別

不管哪一種方式,certbot 都須要驗證域名,可是實現的方式不一樣,這也是二者有區別的根本緣由。

  • standalone 方法生成和更新證書的時候,certbot 須要使用 443 或者 80 端口來驗證域名,所以致使須要暫時中止服務器。這種方式不須要給出網站根目錄
  • webroot 方法沒有上述問題。不過 webroot 方法配置略微複雜,而且須要給出網站根目錄

webroot 方式之因此不須要 80443 端口,是由於它的實現方式是,在網站根目錄中生成一個臨時子目錄 .well-known/acme-challenge,而後從 certbot 的服務器向這個路徑發送請求,若是請求成功,那麼驗證經過。

這篇文章簡單介紹了幾個 webroot 模式可能會遇到的問題。

standalone 模式

基本命令爲:

sudo letsencrypt certonly --standalone
複製代碼

須要使用 80443 端口,能夠經過 --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.comwww.example.com
這些域名均可以使用該證書。

共生成了四個文件:

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

/etc/letsencrypt/archive/example.com 目錄保存原件。
/etc/letsencrypt/live/example.com 目錄保存文件的軟連接,能夠理解爲快捷方式。

live/中的文件貌似不僅是原件的軟連接那麼簡單,可是沒有仔細研究。

privkey.pem 爲私鑰,務必妥善保管。

webroot 模式

這種方式須要給出網站根目錄做爲參數。從這名字 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 配置

# 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
複製代碼

Nginx 配置

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.comwww.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.comwww.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 方式生成的證書時,仍然能夠選擇 standalonewebroot
那麼看來證書的生成方式是能夠改變的。

可是沒有試過,感興趣的同窗能夠試一下。

更新證書

從證書信息中能夠看到,證書有效期爲90天。在證書到期前須要進行更新。

能夠手動進行更新:

certbot renew
複製代碼

根據 certbot 官方文檔,該命令只會更新30天內即將過時的證書。對其餘的證書沒有影響。

證書更新可使用 crontab 等設置計劃任務實現自動更新,好比天天執行一次 renew 命令。

可是注意,由 standalone 方法生成的證書,更新時也須要使用 80443 端口,所以可能須要(不如說必定須要)在執行 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 官方文檔,不管自動仍是手動,最後都須要把相關文件刪掉。

若是沒有刪除,那麼 archivelive 兩個目錄及其中的文件就仍然存在。執行 certbot certificates 仍然能顯示該證書的信息,不事後面會註明已經失效 INVALID。可是,在執行證書更新的時候,已經撤銷的證書還會被更新。

其餘

頻率限制

Staging Environment - Let's Encrypt 官方文檔

Let's Encrypt 爲證書申請的頻率作了限制,每一個主域名每週不超過20次
若是達到這個 rate limits,不可以再繼續生成了,會報錯。

因此若是隻是爲了學習和測試,最好使用 Let's Encrypt 提供的 Staging Environment(模擬環境),沒有頻率限制。
只要在執行命令時加上 --staging 選項就能夠了。

等會用了再玩真的。

關於 HTTPS

百度 LAVAS 項目中關於 HTTPS 的介紹:使用 HTTPS,寫得挺好的。

打個廣告

個人其餘文章:

《polipo/privoxy 實現 Linux 系統全局/自動代理》

相關文章
相關標籤/搜索