使用windows环境的云服务器为域名申请certbot免费SSL证书
作者:一位刚刚走完全程的实践者
适用场景:购买了 Windows ECS 云服务器和域名,需要为微信小程序配置 HTTPS(SSL 证书)的新手
第一阶段:准备工作(避免走弯路)
✅ 你需要准备
- 阿里云 ECS 实例(本文基于 Windows Server 环境)
- 已备案的域名(如果服务器在国内)
- 域名已解析到 ECS 公网 IP(A 记录)
🚧 踩坑预警:DNS 解析
坑点:申请证书时 Certbot 报错 DNS problem: NXDOMAIN
原因:域名解析未生效或记录错误
解决:
- 操作位置:本地电脑的浏览器(登录阿里云/域名控制台)
- 登录域名控制台,确保添加了 A 记录(主机记录 @ 和 www,记录值为 ECS 公网 IP)
- 验证:本地电脑的命令提示符 (CMD) 或 PowerShell
或ping 你的域名nslookup 你的域名 - 注意:解析生效可能需要几分钟到几小时,耐心等待
第二阶段:安装 Nginx(Windows 环境)
📥 下载与安装
- 操作位置:云服务器(通过远程桌面)的浏览器
- 访问 nginx.org 下载 Windows 版本(
.zip包)
- 访问 nginx.org 下载 Windows 版本(
- 操作位置:云服务器的文件资源管理器
- 解压到不含空格和中文的路径,如
C:\server\nginx\nginx
- 解压到不含空格和中文的路径,如
- 操作位置:云服务器的命令提示符 (CMD)(以管理员身份运行)
- 进入解压目录:
cd C:\server\nginx\nginx - 启动 Nginx:
start nginx
- 进入解压目录:
✅ 验证
操作位置:云服务器内的浏览器 或 本地电脑的浏览器
- 访问
http://你的ECS公网IP,看到 “Welcome to nginx!” 即成功
🚧 踩坑预警:端口被占用
操作位置:云服务器的命令提示符 (CMD)
- 检查 80 端口是否被占用:
netstat -ano | findstr :80
第三阶段:安装 WSL 和 Certbot(关键!)
由于 Certbot 官方已停止支持 Windows 原生版本,我们需要通过 WSL(Windows Subsystem for Linux)来运行 Certbot。
1️⃣ 安装 WSL
操作位置:云服务器的 PowerShell(以管理员身份运行)
wsl --install
重启系统。
2️⃣ 安装 Ubuntu 发行版
操作位置:云服务器的 PowerShell(以管理员身份运行)
wsl --install -d Ubuntu-24.04
注意:如果遇到 WSL2 不支持 的错误,请按以下顺序排查:
- 启用 Windows 功能:“虚拟机平台”、“Hyper-V”(操作位置:云服务器的 PowerShell 管理员)
- 确保 BIOS 中开启虚拟化(云服务器需确认实例支持嵌套虚拟化,必要时联系云厂商)
- 终极解决方案:如果虚拟化实在无法开启,改用 WSL1
wsl --set-default-version 1 wsl --install -d Ubuntu-24.04
3️⃣ 在 Ubuntu 中安装 Certbot
操作位置:云服务器内的 WSL 终端(Ubuntu)
- 启动 Ubuntu:可在开始菜单找到 Ubuntu 图标点击,或在 PowerShell/CMD 中输入
wsl - 依次执行:
sudo apt update sudo apt install certbot -y
第四阶段:申请 SSL 证书
📌 使用 webroot 模式(因为 Nginx 在 Windows 上)
操作位置:云服务器内的 WSL 终端(Ubuntu)
sudo certbot certonly --webroot -w /mnt/c/server/nginx/nginx/html -d 你的域名
/mnt/c/是 WSL 访问 Windows C 盘的路径-w后面是你的网站根目录在 Windows 中的实际路径- 可添加多个
-d申请多个域名(如-d www.你的域名)
🚧 踩坑预警 1:80 端口不通
现象:Certbot 报错 Connection refused
排查步骤:
- 检查阿里云安全组
操作位置:本地电脑的浏览器(登录阿里云控制台)- 确保入方向有 TCP 80/80,授权对象
0.0.0.0/0
- 确保入方向有 TCP 80/80,授权对象
- 检查 Windows 防火墙
操作位置:云服务器的 PowerShell(管理员)- 允许 80 端口入站:
New-NetFirewallRule -DisplayName "Allow HTTP 80" -Direction Inbound -LocalPort 80 -Protocol TCP -Action Allow
- 允许 80 端口入站:
- 确认 Nginx 是否运行并监听 80
操作位置:云服务器的命令提示符 (CMD)tasklist | findstr nginx # 看进程 netstat -ano | findstr :80 # 看监听 - 从外部测试端口(非常重要)
操作位置:本地电脑的 PowerShell
显示Test-NetConnection 你的域名 -Port 80TcpTestSucceeded : True才算通
血的教训:即使安全组和防火墙都配置正确,如果重启了 ECS 但没有重启 Nginx,Nginx 可能没有重新绑定端口,导致端口不通!
解决:每次重启 ECS 后,记得手动启动 Nginx:
cd C:\server\nginx\nginx
start nginx
🚧 踩坑预警 2:域名写错
现象:复制证书时提示 No such file or directory
原因:申请时用的域名和复制时写的域名不一致
解决:仔细核对,证书目录在 /etc/letsencrypt/live/你的实际域名/
操作位置:云服务器内的 WSL 终端
ls -l /etc/letsencrypt/live/
第五阶段:配置 Nginx 启用 HTTPS
1️⃣ 复制证书到 Windows
操作位置:云服务器内的 WSL 终端
sudo mkdir -p /mnt/c/ssl
sudo cp /etc/letsencrypt/live/你的域名/fullchain.pem /mnt/c/ssl/
sudo cp /etc/letsencrypt/live/你的域名/privkey.pem /mnt/c/ssl/
2️⃣ 修改 Nginx 配置
操作位置:云服务器的文件资源管理器 或 文本编辑器(如记事本)
- 编辑
C:\server\nginx\nginx\conf\nginx.conf - 添加以下内容(可参考示例配置):
# HTTP 跳转 HTTPS
server {
listen 80;
server_name 你的域名 www.你的域名;
return 301 https://$host$request_uri;
}
# HTTPS 服务器
server {
listen 443 ssl;
server_name 你的域名 www.你的域名;
ssl_certificate C:/ssl/fullchain.pem;
ssl_certificate_key C:/ssl/privkey.pem;
location / {
root html;
index index.html index.htm;
}
}
3️⃣ 测试并重载
操作位置:云服务器的命令提示符 (CMD)
cd C:\server\nginx\nginx
nginx -t # 测试配置文件
nginx -s reload # 重载生效
🚧 踩坑预警:证书文件路径错误
现象:nginx -t 报错 cannot load certificate key
原因:
- 文件确实不存在(忘记复制)
- 路径中的斜杠方向错误(Nginx 在 Windows 下推荐用正斜杠
/或双反斜杠\\) - 权限问题(证书文件无法读取)
解决:
- 操作位置:云服务器的文件资源管理器,检查
C:\ssl下文件是否存在 - 操作位置:云服务器的命令提示符,用
type C:\ssl\privkey.pem测试文件可读性 - 确认配置中的路径正确。
第六阶段:验证与后续
✅ 验证 HTTPS
操作位置:本地电脑的浏览器
- 访问
https://你的域名,看到小锁图标即成功!
🔄 关于证书续期(90天有效期)
Certbot 在 WSL 中会自动安装定时任务,每天检查续期。但续期后证书文件会更新,需要:
- 操作位置:云服务器内的 WSL 终端
sudo cp /etc/letsencrypt/live/你的域名/*.pem /mnt/c/ssl/ - 操作位置:云服务器的命令提示符 (CMD)
nginx -s reload
进阶方案:编写脚本在续期钩子中自动完成复制和重载,感兴趣的可查阅 Certbot 文档。
📚 总结:你可能会踩的坑(快速自查表)
| 问题 | 可能原因 | 解决(含操作环境) |
|---|---|---|
DNS problem: NXDOMAIN | 域名解析未生效 | 本地浏览器登录域名控制台检查 A 记录;本地电脑 CMD 用 ping 或 nslookup 等待生效 |
Connection refused | 80 端口不通 | 云服务器:检查安全组(本地浏览器)、防火墙(云服务器 PowerShell)、Nginx 是否运行(云服务器 CMD);本地电脑 PowerShell 用 Test-NetConnection 测试 |
| 安全组已配但仍不通 | 未重启 ECS 或 Nginx | 云服务器 CMD 手动启动 Nginx |
No such file or directory | 域名写错 | 云服务器 WSL 终端 ls /etc/letsencrypt/live/ 核对目录名 |
cannot load certificate key | 证书文件缺失或路径错 | 云服务器文件资源管理器检查 C:\ssl;云服务器 CMD 确认路径正确 |
| WSL2 安装失败 | 虚拟化未开启 | 云服务器 PowerShell 启用必需功能,或改用 WSL1 |
更多推荐
所有评论(0)