如何自動申請免費的SSL 證書

上次介紹瞭如何經過第三方網站申請免費的SSL 證書,但有效期只有三個月,三個月以後又須要再次申請,記得還好,若是忘了可能還會形成沒必要要的損失。php

Let's Encrypt 是一個免費提供的SSL 證書的CA,雖然每次簽發的有效期都只有三個月,可是發證是自動化的,發證速度較快,而且能夠經過腳原本自動續簽,爲我的網站使用HTTPS提供了一個不錯的選擇。html

Let’s Encrypt (如下簡稱LE)的證書籤發主要使用基於 ACME協議 的證書自動管理客戶端來實現。nginx

LE官方推薦的客戶端是 Certbot ,本文中就是使用 Certbot 來獲取和續簽證書。服務器

LE 是如何自動簽發證書的

假設如今要申請CA 證書的域名是 example.comapp

首先由WebServer(也就是咱們用戶端的服務器)的管理客戶端(如Certbot)發送請求到LE,讓LE來驗證客戶端是否真的控制example.com這個域名,接下來LE會提出一些驗證動做(原文challenges),好比讓客戶端在一個很明顯的路徑上放指定的文件。同時,LE還會發出一個隨機數,客戶端須要用這個隨機數和客戶端本身的私鑰來進行簽名。post

WebServer上的客戶端完成LE指定的域名驗證動做而且將加密後的簽名後,再次發送請求到LE要求驗證,LE會驗證發回來的簽名是否正確,而且驗證域名驗證動做是否完成,以下載指定的文件而且判斷文件裏面的內容是否符合要求。網站

這些驗證都完成之後,能夠申請證書了。加密

完成驗證後,客戶端生成本身的私鑰以及 Certificate Signing Request(CSR) 發送到LE服務器,LE服務器會將CA證書(也是公鑰)發放到你的服務器。spa

這樣就完成了CA證書的自動化發放了。code

使用Certbot 獲取證書

LE 的CA 證書發放原理看着還挺麻煩的,但若是使用 Certbot 客戶端,整個過程仍是挺簡單的。

在正式獲取證書以前,推薦先去Certbot 官網選擇適合本身的系統環境。

我這邊系統環境是Nginx + Ubuntu 18.04 LTS,因此下面介紹的安裝流程只適用於Ubuntu + Nginx

1. 安裝 snap

snap) 是Canonical公司發佈的全新的軟件包管理方式,它相似一個容器擁有一個應用程序全部的文件和庫,各個應用程序之間徹底獨立。使用snap 包的好處就是它解決了應用程序之間的依賴問題,使應用程序之間更容易管理。可是由此帶來的問題就是它佔用更多的磁盤空間。

$ sudo apt update
$ sudo apt install snapd

2. 安裝 certbot

在安裝 Certbot 以前,最好先移除歷史快照。

$ sudo apt-get remove certbot

進行安裝:

$ sudo snap install --classic certbot

3. 生成證書

安裝完成以後,下一步須要作的就是生成證書了,這裏有兩種方式:

  1. 生成證書並自動配置
$ sudo certbot --nginx
  1. 生成證書手動配置
$ sudo certbot certonly --nginx

我選擇的是手動配置,大概流程以下:

  1. 輸入經常使用郵箱,用來接收通知和恢復密鑰。
  2. 贊成使用協議。
  3. 輸入須要作受權的域名,多個域名用空格隔開。
  4. 等待驗證經過。

若是其中某個域名驗證失敗,則不會生成密碼。

一切正常的話,能夠看到/etc/letsencrypt/live/your_sites/目錄下多了四個文件:

  • cert.pem : 公鑰,服務器證書
  • chain.pem : 中間證書
  • fullchain.pem : 前兩個的合集
  • privkey.pem : 私鑰

其中配置Nginx SSL 只須要用到fullchain.pemprivkey.pem

server {
    listen       443 ssl;
    server_name www.example.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.exampl.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    ...
}

至此,就已經完成了生成證書到配置的所有過程了。

自動續簽

若是快要到期了,可使用certbot renew對證書進行更新,須要注意的是,若是證書還沒有過時,則不會更新。

能夠配合conrtab使用,每半個月的凌晨三點自動續簽一次。

$ 0 3 15 * * certbot renew

參考連接