Step 1:安装 Certbot
下载 Certbot 官方 Windows 安装包:https://certbot.eff.org/instructions?ws=apache&os=windows
或使用 winget 安装:
winget install certbot
装完以管理员身份开 CMD,验证:
certbot --help
Step 2:申请证书
方案 A:standalone(需要停 Apache)
certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com
会问邮箱 → 输 → 同意条款(Y) → 订阅(Y)。成功后证书在:
C:\Certbot\live\yourdomain.com\fullchain.pem
C:\Certbot\live\yourdomain.com\privkey.pem
缺点:续期时也要停 Apache(standalone 要抢 80 端口),等于短暂停机。
方案 B:webroot(推荐,不停 Apache)
原理:Certbot 在网站根目录下扔一个 .well-known/acme-challenge/ 文件,CA 来爬这个文件验证域名归属,Apache 不用停。
certbot certonly --webroot -w C:\xampp\htdocs -d yourdomain.com -d www.yourdomain.com
-w 后面是 WordPress 所在的根(如果你 WordPress 在 htdocs/wordpress,那 -w C:\xampp\htdocs\wordpress)。
如果卡验证,多半是:① 80 端口被 ISP 封(家宽)② 防火墙没放 80 ③ httpd.conf 里 Deny 了外部访问(
Require local没改成Require all granted)
Step 3:配置 Apache 指向新证书
打开 C:\xampp\apache\conf\extra\httpd-ssl.conf,找到这三行改掉:
SSLCertificateFile "C:\Certbot\live\yourdomain.com\fullchain.pem"
SSLCertificateKeyFile "C:\Certbot\live\yourdomain.com\privkey.pem"
Apache 2.4.8+ 只要上面两行就够了。一定要用 fullchain.pem 而不是 cert.pem,否则证书链不完整,前端调 API 会报 UNABLE_TO_VERIFY_LEAF_SIGNATURE。
如果你的 WordPress 是用虚拟主机跑的(httpd-vhosts.conf 里 <VirtualHost *:443> 那段),证书路径改在那个 <VirtualHost> 块里更干净。
Step 4:防火墙 + 路由器放行
Windows 防火墙放行 443(80 也留着给续期/重定向):
netsh advfirewall firewall add rule name="HTTPS Apache" dir=in action=allow protocol=TCP localport=443
netsh advfirewall firewall add rule name="HTTP Apache" dir=in action=allow protocol=TCP localport=80
云服务器还要去安全组把 80/443 入站打开,家宽要去路由器端口映射把 WAN:443 → LAN:443 指到这台机器。
Step 5:重启 Apache,验证
浏览器访问 https://yourdomain.com,点锁图标看签发者是不是 Let’s Encrypt。
Step 6:WordPress HTTPS 坑(必做)
如果 WordPress 之前是用 http:// 装的,数据库里 siteurl / home 还是 http,切 HTTPS 后会 mixed content——CSS/JS/图片全 404,后台还可能登不进。
在 wp-config.php 里强制覆写(推荐):
define('WP_HOME', 'https://yourdomain.com/wordpress');
define('WP_SITEURL', 'https://yourdomain.com/wordpress');
然后后台 → 设置 → 固定链接 随便点保存一下,把旧 http 的附件地址也刷掉。或者用 “Better Search Replace” 插件批量替换。
家宽场景的特殊处理
国内 ISP 封 80/443 是大概率,Let’s Encrypt HTTP-01 验证会直接失败。三条绕法:
- DNS-01 验证(最干净):
certbot --manual --preferred-challenges dns,去域名商后台加 TXT 记录验证 - 改用非标端口:路由器 WAN:8443 → LAN:443
- 云服务器反代:买台便宜的国内轻量云,Nginx 反代回家里
家宽如果是动态公网 IP,还得配 DDNS(花生壳/阿里云 DDNS/Cloudflare API)。
自动续期
Let’s Encrypt 证书 90 天有效期。Certbot Windows 安装时会自动往任务计划程序塞一个定时任务。
如果用 standalone 方案,续期时会抢 80 端口,需要在续期 hook 里加停启 Apache。webroot 方案没这问题。
手动测续期:
certbot renew --dry-run
