申请并配置 Let’s Encrypt 的免费 SSL 证书

  前一段因为网络原因,导致国内 HTTPS 无法访问我的博客,折腾了好一阵,顺手整理一下申请并配置 Let’s Encrypt 免费 SSL 证书的操作步骤,使用环境为 Ubuntu 17.10 + Nginx。

0. 配置 DNS

  首先需要配置 DNS,建立一条 A 记录,将要使用的域名指向服务器 IP,具体方法因 DNS 服务提供商不同而有所差异,一般服务提供商都会提供便捷的网页管理界面,如 DNSPod 配置如 图1:

图1

图1

  后续示例使用的域名为 test.nex3z.com。

1. 安装并配置 Nginx

  为了尽可能完整地进行说明,这里从安装 Nginx 开始。

1.1. 安装 Nginx

  安装 Nginx 非常简单,执行如下命令即可:

sudo apt-get update
sudo apt-get install nginx

1.2. 配置 ufw

  如果启用了 ufw,需要配置防火墙允许 Nginx 的 HTTPS 流量:

sudo ufw allow 'Nginx Full'

  如果之前启用过 Nginx HTTP,就可以删掉它了:

udo ufw delete allow 'Nginx HTTP'

1.3. 配置 Nginx

  进入 Nginx 配置目录

cd /etc/nginx/sites-available/

复制一份默认配置,命名为 test,并进行编辑:

cp default test
nano test

在其中找到 server_name一行:

server_name _

将其中的 _ 替换为域名,即 test.nex3z.com:

server_name test.nex3z.com

如果有多个域名,域名间以空格分隔。

  保存 test 配置文件后,将其连接至启用站点目录:

sudo ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/test

然后删除默认站点配置:

rm /etc/nginx/sites-enabled/default

  使用如下命令检查配置文件正确性:

sudo nginx -t

配置文件无误后,重启 Nginx:

sudo systemctl reload nginx

  此时访问 http://test.nex3z.com/,应该可以看到 Nginx 的默认页面。

2. 申请并配置 Let’s Encrypt 的 SSL 证书

2.1. 安装 CertBot

  使用 CertBot 可以非常方便快捷地申请和配置 SSL 证书,在官网可以看到任意服务器和操作系统组合的配置方法。这里还是以 Ubuntu 17.10 + Nginx 为例,依次执行如下命令安装 cerbot:

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 python-certbot-nginx 

2.2. 申请并配置证书

  然后只需一条命令即可完成申请和配置的整个过程:

sudo certbot --nginx

  cetbot 首先需要输入一个邮件地址,用于紧急续期和通知:

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

  同意协议后,会询问要申请的域名:

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: test.nex3z.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

  输入数字选择域名即可,这里输入1。之后开始获取证书并校验,校验成功后,会提示选择是否要把 HTTP 流量重定向到 HTTPS,可根据实际需要选择:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

这里选择 2,将 HTTP 流量重定向到 HTTPS,回车确认后,即大功告成:

Congratulations! You have successfully enabled https://test.nex3z.com

  访问 https://test.nex3z.com/,应该可以看到 Nginx 的默认页面了。

2.3. 检查服务器配置

  此时再看服务器配置:

cat /etc/nginx/sites-available/test

可以看到 Certbot 自动添加了如下内容:

    listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/test.nex3z.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.nex3z.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot

这里监听了 443 端口,并配置了秘钥位置,然后检查 scheme,将非 HTTPS 流量通过 301 重定向到 HTTPS。如果需要同时保留 HTTP 和 HTTPS 访问,删掉 if ($scheme != "https") 一段即可。

3. 自动续租

  Let’s Encrypt 的证书有效期为 90 天,Certbot 提供了一个 Cron 任务进行自动续租。

  首先检查一下自动续租功能是否正常:

sudo certbot renew --dry-run

该功能会在有效期小于30天时进行续租,否则不进行任何操作。如果没有报错,编辑 crontab:

sudo crontab -e

在其中加入:

30 2 * * * /usr/bin/certbot renew

即在每天凌晨 2 点 30 分检查证书情况并自动续租。如果服务器时区和本地时区不同,注意需要换算一下时间,避免在本地高峰期进行续租。