Let's Encrypt 入门教程

如果你拥有自己的域名和服务器,并且想要免费获取 HTTPS 证书,Let's Encrypt 是你的不二之选。本文以 Debian/Ubuntu 系统和 Nginx 为例讲解如何在服务器上部署 Let's Encrypt 证书。


第一步:安装客户端

在终端执行如下指令。

1
sudo apt-get install letsencrypt

Let's Encrypt 客户端名称可能是 letsencryptcertbot. 请用 which 指令看看你属于哪一种情形。后文将统一使用 letsencrypt 指令,如有需要请自行替换成 certbot.


第二步:获取证书

假设你已经获取了 example.com 的域名,并且其 DNS A Record (不能是CNAME) 指向了当前服务器的 IP 地址。Let's Encrypt 客户端会通过查询 DNS 信息验证服务器的身份。在这里,我推荐使用独立模式(standalone)获取和更新证书。

由于客户端要使用 80 或 443 端口,请首先关闭占用此端口的程序。通常停止 Nginx 即可。

1
sudo service nginx stop

然后在终端输入下面的指令获取证书。

1
sudo letsencrypt certonly --standalone

接下来会出现一个文字图形界面。先输入电子邮件地址。



之后同意服务条款。



最后输入服务器的域名。在具有 DNS 记录的前提下,你还可以加上任何你想要的二级域名。稍等片刻,客户端就会完成身份验证。证书与相关信息存放在 /etc/letsencrypt 文件夹下。请将它备份至一个安全的地方。




第三步:配置 Nginx

如果你已经配置好了 HTTP 服务,/etc/nginx/nginx.conf 文件中应该有类似下面的片段。

1
2
3
4
5
6
7
8
9
10
11
12
http {
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
root /var/www/html;
}
...
}
...
}

你需要再加上一个 server 条目用于 HTTPS 服务。改完之后的结果是这个样子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
root /var/www/html;
}
...
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
root /var/www/html;
}
...
}
...
}

记得把所有 example.com 替换成你自己的域名。

保存配置文件,启动 Nginx.

1
sudo service nginx start

恭喜你已经成功部署了 Let's Encrypt 证书!


证书的更新

Let's Encrypt 证书有效期为三个月,你需要在证书到期之前续约。官方会在证书到期前向你发送邮件,因此不必担心错过日期。你可以运用 cron 实现证书的自动更新,不过手动操作已经足够简单了。

1
2
3
4
5
6
7
8
# 先停止 Nginx, 释放端口
sudo service nginx stop

# 更新证书
sudo letsencrypt certonly --standalone

# 启动 Nginx
sudo service nginx start


进阶:HTTPS 跳转

现在,你的服务器同时接受 HTTP 和 HTTPS 请求。如果你希望只受理 HTTPS 请求,可以在 nginx.conf 中添加一个 301 跳转规则,告知浏览器将 HTTP 变成 HTTPS.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
root /var/www/html;
}
...
}
...
}


问题与解答

在证书获取与更新时,为何使用 standalone 而不是 webroot 模式?

Let's Encrypt 提供了多种身份验证方式。与 standalone 相比,webroot 模式最大的优势在于没有宕机时间。然而 webroot 存在一些隐含的问题,它们是新手不易解决的。例如,webroot 需要在 nginx.conf 中添加特殊的规则以允许外界访问,但即便如此,该路径依旧被部分防火墙封杀。此外,启用了 301 跳转的服务器无法直接使用 webroot 更新证书,这期间需要反复修改配置文件,比 standalone 模式更为繁琐。十几秒的宕机时间对一般的网站来说可以忽略不计,因此我建议新手优先使用 standalone 模式。

如何发现占用某个端口的进程?

下面的指令可以列出占用每个 TCP 端口的进程。

1
sudo netstat -ntlp

找到进程号之后可以用 kill -9 强制关闭程序。

如何使用文字图形界面?

文字图形界面的操作非常简单。tab 键用于切换光标所在区域,space 键勾选或取消选项,enter 键确定,ctrl-c(强制)退出。