介绍

Let’s Encrypt 是由 Internet Security Research Group(ISRG)开发的免费开放证书颁发机构。 今天几乎所有浏览器都信任 Let’s Encrypt 颁发的证书。

在本教程中,我们将提供有关如何使用 Ubuntu 16.04 上的 certbot 工具使用 Let’s Encrypt 来保护您的 Nginx 的分步说明。

准备条件

在继续本教程之前,请确保您已满足以下先决条件:

  • 您有一个指向公共服务器 IP 的域名。 在本教程中,我们将使用 example.com。
  • 您按照这些说明安装了 Nginx 。
  • 您有一个适用于您的域的服务器块。 您可以按照本文获取有关如何创建一个的详细信息。

安装 Certbot

Certbot 是一个功能齐全且易于使用的工具,可以自动完成获取和更新 Let’s Encrypt SSL证书以及配置Web服务器以使用它们的任务。 certbot 包包含在默认的 Ubuntu 存储库中。

更新软件包列表并安装 certbot 软件包:

sudo apt update
sudo apt install certbot

Certbot验证方式

  • cerbot验证方式有下面几种:apache,nginx,webroot,standalone,dns plugins,manual
  • apache,nginx申请的证书只用自身服务的,我们选择通常生产有Standanlone 、Webroot,Manual,DNS Plugins
  • Standalone 方式: certbot 会自己运行一个 web server 来进行验证,暂时占用服务器的 80 或者 443 端口。如果我们自己的服务器上已经有 web server 正在运行 (比如 Nginx 或 Apache ),用 standalone 方式的话需要先关掉它,以免冲突。
  • Webroot 方式: certbot 会利用既有的 web server,在其 web root目录下创建隐藏文件, Let’s Encrypt 服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权。
  • Manual:表示手动交互模式,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择
  • DNS Plugins:使用各类型的DNS插件证明这个域名是属于你的,自动验证方式创建泛域名证书,不是所有的域名都能用自动验证方式创建证书,需要查看官方支持域名供应商,如阿里云是没有提供API来自动验证

获取证书

这里选择standalone方式

注意:certbot 默认使用http方式对域名所有权进行验证,该操作需要绑定vps的80端口。如果80端口已被占用,请先停止占用的进程,例如停止Nginx:systemctl stop nginx

阿里云、腾讯云等购买的服务器,还需要在vps网页后台的安全组中放行80端口。

如果有其他二级域名,继续添加-d参数即可。

1
root@vultr:~# certbot certonly --standalone -d example.com -d www.example.com ...

如果域名记录未指向服务器的IP,会报错并提示域名解析问题。

配置证书

各个web服务器的配置不一样,本文提供Nginx的配置例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name www.example.com example.com;
rewrite ^(.*) https://$server_name/$1 permanent;
}

server {
listen 443 ssl;
server_name www.example.com example.com;
charset utf-8;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; # TLSv1.3需要nginx 1.13.0以上版本
# 如果nginx版本低,建议使用这种加密算法配置
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
keepalive_timeout 70;

# 这里填写其他配置
}

配置分为两个server段,第一段是所有http请求都导向https;第二段以ssl开头的配置都和证书相关:设置证书和私钥的位置、证书采用的协议、证书的加密算法等信息。

为了增强安全性,ssl_protocols、ssl_ciphers和ssl_prefer_server_ciphers的配置建议采用以上配置。

配置好以后,运行nginx -t命令查看有无错误。配置正确的话用systemctl restart nginx 重新启动nginx。

https使用443端口,如果开启了防火墙,记得放行https服务:

1
2
3
4
firewall-cmd --permanent --add-service=https
# 如果监听了其他端口,使用下面的命令
# firewall-cmd --permanent --add-port=端口号/tcp
firewall-cmd --reload

证书自动更新

Let’s Encrypt证书的有效期是三个月,超过期限则需要续签。证书续期可以手动完成,例如:

1
2
3
systemctl stop nginx
certbot renew
systemctl restart nginx

也可以配置crontab任务自动续签,在/etc/crontab文件末添加一行:

0 0 1 */2 0 root systemctl stop nginx; /usr/local/bin/certbot renew; systemctl restart nginx

ubuntu默认安装的certbot路径是/usr/bin/certbot,可使用 which certbot 查看,如果输出不同,请记得替换。该配置将每两个月自动运行certbot并续签证书。如果你的证书快到期了还没有续签,贴心的EFF(电子前哨基金会)会发邮件提醒,记得到期前续签就行。