如果你拥有自己的域名和服务器,并且想要免费获取 HTTPS 证书,Let's Encrypt 是你的不二之选。本文以 Debian/Ubuntu 系统和 Nginx 为例讲解如何在服务器上部署 Let's Encrypt 证书。
第一步:安装客户端
在终端执行如下指令。
1 | sudo apt-get install letsencrypt |
Let's Encrypt 客户端名称可能是 letsencrypt
或 certbot
. 请用 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 | http { |
你需要再加上一个 server 条目用于 HTTPS 服务。改完之后的结果是这个样子。
1 | http { |
记得把所有 example.com
替换成你自己的域名。
保存配置文件,启动 Nginx.
1 | sudo service nginx start |
恭喜你已经成功部署了 Let's Encrypt 证书!
证书的更新
Let's Encrypt 证书有效期为三个月,你需要在证书到期之前续约。官方会在证书到期前向你发送邮件,因此不必担心错过日期。你可以运用 cron
实现证书的自动更新,不过手动操作已经足够简单了。
1 | 先停止 Nginx, 释放端口 |
进阶:HTTPS 跳转
现在,你的服务器同时接受 HTTP 和 HTTPS 请求。如果你希望只受理 HTTPS 请求,可以在 nginx.conf
中添加一个 301 跳转规则,告知浏览器将 HTTP 变成 HTTPS.
1 | http { |
问题与解答
在证书获取与更新时,为何使用 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
(强制)退出。