参考教程:Create Let’s Encrypt Wildcard Certificates in NGINX
Let’s Encrypt 是一个免费、开放且自动化的证书颁发机构,由 Linux 基金会进行日常管理维护。它为大量网站提供 TLS 证书,帮助网站轻松实现 HTTPS 加密。下面我将介绍如何利用 Let’s Encrypt 为网站生成免费的泛域名 SSL 证书。
❯ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
❯ uname -i
x86_64
❯ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
Certbot 是一个自动化的工具,用于获取和续签 Let’s Encrypt 的 SSL 证书。
# 安装 snap
sudo apt install snap -y
sudo snap install core
sudo snap refresh core
# 通过 snap 安装 certbot
sudo snap install --classic certbot
# 创建软连接,避免 sudo 下找不到命令
sudo ln -s /snap/bin/certbot /usr/bin/certbot
通过 Certbot 获取泛域名证书。泛域名证书允许我们为一个域名及其所有子域名使用同一个 SSL 证书。
sudo certbot certonly --manual --preferred-challenges=dns --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d "*.codejerry.cn"
参数释义:
certonly
: 仅获取证书,不尝试安装。--manual
: 手动模式,需手动执行一些步骤,例如添加 DNS 记录。--preferred-challenges=dns
: 使用 DNS 验证域名所有权。--server
: 指定 ACME 服务器的 URL。--agree-tos
: 同意服务条款。-d
: 指定获取证书的域名。在这个过程中,你要去域名托管平台(如阿里云),添加对应的TXT
解析记录, Certbot 会指导你通过添加 DNS TXT 记录
来验证你对域名的控制权。完成验证后,证书(两个文件)将被颁发,并保存在 /etc/letsencrypt/live/codejerry.cn/
目录下:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/codejerry.cn/fullchain.pem
Key is saved at: /etc/letsencrypt/live/codejerry.cn/privkey.pem
This certificate expires on 2024-05-04.
These files will be updated when the certificate renews.
其中 fullchain.pem
是证书文件,privkey.pem
是私钥文件。
这里也可以不用 manual 手动添加解析,但需要借助第三方托管平台,比如 cloudflare,当前暂不考虑。
下一步,3个月后更新证书,按照下面的提示即可(重新运行之前的指令)
NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates
requires the use of an authentication hook script (--manual-auth-hook) but one was not provided.
To renew this certificate, repeat this same certbot command before the certificate's expiry date.
对于单个域名的证书,可以省略 DNS 验证步骤。假设域名 mydomain.codejerry.cn
已经解析到服务器 IP,可以直接运行以下命令:
sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d "mydomain.codejerry.cn"
按照提示操作,选择 Nginx 插件进行验证。
生成证书后,需要在 Nginx 配置中添加 SSL 相关设置,比如:
server {
listen 443 ssl;
server_name codejerry.cn test.codejerry.cn;
ssl_certificate /etc/letsencrypt/live/codejerry.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/codejerry.cn/privkey.pem;
...
}
执行 sudo nginx -s reload
重启 Nginx 生效。
Let’s Encrypt 的证书有效期为 90 天,因此需要定期更新。可以通过设置 crontab 定时任务来自动更新证书(仅对单域名有效)
sudo crontab -e
# 添加以下内容
0 0 1 * * /usr/bin/certbot renew --quiet
注:自动更新未测试过,不确定有效
如果想在服务器B上的相同域名下使用这个证书,不用重新获取,迁移过去即可,方法如下:
cd到证书路径下,查看证书,发现证书是软链接的
根据软链接的提示找到证书源文件,发现会有四个文件。原证书文件路径在/etc/letsencrypt/archive/codejerry.cn
进入上边的路径,然后将使用的两个文件内容重定向出来
cd /etc/letsencrypt/archive/codejerry.cn
cat fullchain1.pem > full
cat privkey1.pem > privkey
将full和privkey两个文件复制到服务器B即可
通过上述步骤,可以为你的网站配置泛域名或普通域名的 SSL 证书,提高网站的安全性和可信度。