Let's Encrypt
提示
大致步骤就是:
- 单个 证书,需要使用80端口自动验证服务器所有权,选
default options - 80端口不通 或 通配符 证书(不支持多级子域名),需要DNS TXT记录或者需要生成通配符域名证书,选
full options选项
然后输入Host(在这里指你的域名或者子域名),选择自动还是DNS手动。以下都已通配符证书为例。
Linux
1. 安装 Certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot
# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot
# 或使用 snap 安装(推荐)
sudo snap install --classic certbot
2. 申请通配符证书
方法一:手动 DNS 验证
# Certbot(< 1.0)
sudo certbot certonly --manual --preferred-challenges dns -d "example.com" -d "*.example.com" --server https://acme-v02.api.letsencrypt.org/directory
# Certbot(>= 1.0)默认使用 ACME v2,不需要指定 `--server`
sudo certbot certonly --manual --preferred-challenges dns -d "example.com" -d "*.example.com"
执行后会提示:
- 添加 TXT 记录
_acme-challenge.example.com - 记录值为系统生成的一串字符
- 添加后等待 DNS 生效,按回车继续
方法二:使用 DNS 插件(自动验证)
Cloudflare
# 安装插件
sudo apt install python3-certbot-dns-cloudflare
# 创建 API token 文件
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/cloudflare.ini
# 内容如下:
# dns_cloudflare_api_token = 你的API_TOKEN
# 设置权限
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# 申请证书
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d "example.com" \
-d "*.example.com"
阿里云 DNS
# 安装插件
pip install certbot-dns-aliyun
# 创建配置文件
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/aliyun.ini
# 内容:
# dns_aliyun_access_key = 你的AccessKey
# dns_aliyun_access_key_secret = 你的AccessKeySecret
# 设置权限
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# 申请证书
sudo certbot certonly \
--authenticator dns-aliyun \
--dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
-d "example.com" \
-d "*.example.com"
华为云 DNS
# 安装插件
pip install certbot-dns-huaweicloud
# 创建配置文件
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/huaweicloud.ini
# 文件内容如下:
# dns_huaweicloud_access_key_id = 你的AccessKeyId
# dns_huaweicloud_secret_access_key = 你的SecretAccessKey
# dns_huaweicloud_region = cn-north-4
# 设置权限
sudo chmod 600 /etc/letsencrypt/huaweicloud.ini
# 申请证书
sudo certbot certonly \
-a dns-huaweicloud \
--dns-huaweicloud-credentials /etc/letsencrypt/huaweicloud.ini \
-d "example.com" \
-d "*.example.com" \
--dns-huaweicloud-propagation-seconds 60
- cn-north-1 # 华北-北京一
- cn-north-4 # 华北-北京四
- cn-east-3 # 华东-上海一
- cn-south-1 # 华南-广州
- ap-southeast-1 # 亚太-新加坡
3. 证书位置
申请成功后,证书文件位于:
/etc/letsencrypt/live/example.com/
├── cert.pem # 证书文件
├── chain.pem # 链文件
├── fullchain.pem # 完整证书链(nginx证书)
└── privkey.pem # 私钥(nginx私钥)
4. 自动续期
# 测试续期
sudo certbot renew --dry-run
# 自动续期已配置在 crontab 或 systemd timer
# 查看定时任务
sudo systemctl list-timers | grep certbot
注意事项
- DNS 验证:通配符证书必须使用 DNS-01 验证方式
- 记录生效:DNS 记录可能需要几分钟到几小时生效
- 权限要求:需要域名的 DNS 管理权限
- 证书有效期:Let's Encrypt 证书有效期为 90 天
- 速率限制:注意 Let's Encrypt 的申请频率限制
常见问题
Q: 通配符证书能覆盖多级子域名吗?
A: 不能。*.example.com 只覆盖一级子域名,如 www.example.com,不包括 a.b.example.com。
Q: 如何同时申请多个域名?
sudo certbot certonly --manual --preferred-challenges dns \
-d "example.com" -d "*.example.com" \
-d "example.org" -d "*.example.org"
需要为每个域名添加对应的 TXT 记录。
win-acme
1. 下载工具
2. 申请通配符证书
# 以通配符证书为例,需要使用DNS验证。使用80端口自动验证的没有尝试过。
cmd> wacs.exe
# 下面的选项依次选择
> M: Create certificate (full options)
> 2: Manual input
## Host输入(逗号分割)
> forforio.cn,*.forforio.cn
> 回车
> 1: Separate certificate for each domain (e.g. *.example.com)
> 6: [dns] Create verification records manually (auto-renew not possible)
## 选2 使用为 RSA 现在是现代浏览器兼容性最好的证书秘钥类型
> 2: RSA key
## 2和3都可以,这里以2为例(nginx可以直接使用)
> 2: PEM encoded files (Apache, nginx, etc.)
> 3: PFX archive
## 输入证书要生成到哪个文件夹
> D:\Program Files\nginx-1.28.0\ssl
## 选择 1.None 不加密私钥,选择 2. console** 在控制台输入私钥加密密码
> Save to vault for future reuse? (y/n*) n不保存
## 接下来会询问是否还要其他格式的证书。需要的话会填写和上面一样的信息。接下来下一步
> 3: No (additional) installation steps
## 这里之后过一会会让你以 Record 创建一个子域名,DNS解析选择TXT,value为Content。现在去你的DNS服务商上进行新建解析。
## 新建完成,回到CMD敲击回车,提示 Preliminary validation succeeded 即为成功,然后会让你删除这条记录再次敲击回车。
> Do you want to specify the user the task will run as? (y/n*) - n
## 完成
> Q: Quit
## nginx配置这两个 证书链和私钥
ssl_certificate "D:/Program Files/nginx-1.28.0/ssl/forforio.cn-chain.pem";
ssl_certificate_key "D:/Program Files/nginx-1.28.0/ssl/forforio.cn-key.pem";
解密私钥
重要
如果上方选择了私钥加密证书,那么nginx配置之后,每次 nginx -t, nginx -s reload 都要输入密码,可以使用以下 powershell 命令生成无密码的私钥文件:
openssl rsa -in forforio.cn-key.pem -out forforio.cn-key-nopass.pem
nginx使用无密码的私钥:
ssl_certificate "D:/Program Files/nginx-1.28.0/ssl/forforio.cn-chain.pem";
ssl_certificate_key "D:/Program Files/nginx-1.28.0/ssl/forforio.cn-key-nopass.pem";
转换格式
fpx 转为 nginx 能用的格式:
# 提取证书
openssl pkcs12 -in "D:\Program Files\nginx-1.28.0\ssl\yu.forforio.cn.pfx" -clcerts -nokeys -out "D:\Program Files\nginx-1.28.0\ssl\yu.forforio.cn.crt"
# 提取私钥
openssl pkcs12 -in "D:\Program Files\nginx-1.28.0\ssl\yu.forforio.cn.pfx" -nocerts -nodes -out "D:\Program Files\nginx-1.28.0\ssl\yu.forforio.cn.key"
警告
-legacy: 当报错的时候,可能是因为 OpenSSL 3.0 默认禁用了旧的 RC2 加密算法,而 win-acme 生成的 PFX 文件使用了 RC2-40-CBC 加密。添加这个选项以启用旧算法支持。
DNS-TXT验证
nslookup -q=TXT <你的域名>
