我的服务器是一台独立的VPS,跑着 CentOS 7 系统,并且已经通过 LNMP 环境搭建了 WordPress 网站。你的网站现在是可以通过 http://mydomain.com
正常访问的。
如果你用的是宝塔面板或者其他一键脚本,可能自带了SSL配置功能,本文就不需要了。可惜我用的是lnmp的早起版本,没有自带ssl功能。
1. 为什么要自己动手搞 HTTPS
用 VPS 搭建 WordPress,其实并不难,真正让人挠头的是——免费 SSL 证书的自动化部署。市面上很多面板、云服务都有一键安装,但老版本 LNMP 没这福利,你就得自己想办法了。不少云提供商的证书要几十上百,一个网站
你可能会疑惑:"免费的证书,靠谱吗?" 放心,它颁发的证书在所有主流浏览器那里都是 "通行证",跟那些每年几千块的商业证书在加密效果上没区别。唯一的小区别是有效期 —— 只有 90 天。别嫌短,这恰恰是为了安全,逼着你定期更新,避免证书过期了都不知道。
如果把 Let's Encrypt 比作证书工厂,那 acme.sh 就是去工厂取货的 "最优路线导航"。这工具牛就牛在它是用纯 Shell 脚本写的,啥 Python 啊、Perl 啊这些乱七八糟的依赖都不需要,扔到任何支持 Shell 的系统里都能跑。
而 acme.sh 这个小家伙,就是你的救星:
-
完全 Shell 编写,轻便到不像话
-
支持 ACME v1/v2 协议(包括通配符证书)
-
不依赖 Python,不用官方 Certbot
-
3 分钟上手,自动续期无忧
-
对 Docker、IPv6 友好,还能用 cronjob 提醒续期
-
免费(来自 Let's Encrypt)
你能用它做什么?一句话:颁发、安装、续期一条龙。
我为啥推荐它?你看看这堆优点就知道了:
- 小巧精悍:就一个脚本文件,下载下来直接能用,不像有些客户端,安装起来还得配这配那。
- 全自动化:不仅能申请证书,还能自动续期,续期完了还能自动重启服务器让证书生效,简直是 "甩手掌柜" 的最爱。
- 兼容性强:不管你是用 Nginx、Apache,还是 Lighttpd,甚至是在 Docker 里,它都能搞定。
- 支持 IPv6:现在 IPv6 不是越来越普及了嘛,这工具早就跟上了。
- 通配符证书也能搞:想给 *.yourdomain.com这种泛域名申请证书?没问题,它支持 ACME v2 协议,轻松搞定。
- 不需要 root 权限:这一点对安全性要求高的同学来说太重要了,普通用户权限就能操作,降低了安全风险。
最重要的是,这玩意儿是开源的,代码都在 GitHub 上挂着,全世界的开发者都在盯着,有问题很快就能修复,用着放心。
2. 远程接入 VPS
打开终端,直接连上你的服务器:
ssh root@你的服务器IP
建议你先确认 VPS 系统时间正确(date
查看),否则证书验证可能直接翻车。
3. 安装 acme.sh
3.1 安装 socat
acme.sh 需要 socat
来处理验证:
yum install -y socat
3.2 获取 acme.sh
curl https://get.acme.sh | sh
执行完后,会在 ~/.acme.sh
目录生成核心脚本。
3.3 自动更新脚本
acme.sh --upgrade --auto-upgrade
3.4 设置默认 CA
acme.sh 默认用 ZeroSSL,但我们目标是 Let's Encrypt:
acme.sh --set-default-ca --server letsencrypt
3.5 让变量生效
source ~/.bashrc
4. 颁发证书
acme.sh 支持两种验证方式:HTTP 验证 & DNS 验证。
这里选 HTTP 方式,因为简单直接:
# 停止Nginx
service nginx stop
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
参数解释:
-
-d
指定域名(可多个) -
--webroot
填网站根目录
acme.sh 会自动在 .well-known/acme-challenge
生成验证文件,验证完会帮你删除,不留垃圾。
5. 安装证书到 Nginx
先准备目录:
mkdir -p /usr/local/nginx/conf/ssl/mydomain.com
执行安装:
acme.sh --install-cert -d yourdomain.com \
--key-file /usr/local/nginx/conf/ssl/mydomain.com/key.pem \
--fullchain-file /usr/local/nginx/conf/ssl/mydomain.com/cert.pem \
--reloadcmd "service nginx force-reload"
--reloadcmd
参数非常关键,证书续期后会自动重载 Nginx,不用你半夜爬起来手动重启。
6. 配置 Nginx 支持 HTTPS
编辑你的站点配置:
vi /usr/local/nginx/conf/vhost/mydomain.com.conf
强制跳转到 HTTPS
server {
listen 80;
server_name yourdomain.com www.mydomain.com;
return 301 https://$host$request_uri;
}
HTTPS 配置
server {
listen 443 ssl;
server_name yourdomain.com www.mydomain.com;
ssl_certificate /usr/local/nginx/conf/ssl/mydomain.com/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/mydomain.com/key.pem;
ssl_session_timeout 1d;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_cache shared:SSL:10m;
root /home/wwwroot/yourdomain.com;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
7. 重启 Nginx
service nginx restart
此时访问你的域名,应该已经能看到 🔒 小锁了。我们可以通过浏览器访问域名,并查看证书的相关信息。
8.遇到的坑
在执行acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ 时遇到下面的报错
Using CA: https://acme-v02.api.letsencrypt.org/directory
[Mon Aug 11 17:23:32 CST 2025] Multi domain='DNS:mydomain.com,DNS:www.mydomain.com'
[Mon Aug 11 17:23:33 CST 2025] Getting webroot for domain='mydomain.com'
[Mon Aug 11 17:23:33 CST 2025] Getting webroot for domain='www.mydomain.com'
[Mon Aug 11 17:23:34 CST 2025] Verifying: mydomain.com
[Mon Aug 11 17:23:34 CST 2025] Pending. The CA is processing your order, please wait. (1/30)
[Mon Aug 11 17:23:37 CST 2025] mydomain.com: Invalid status. Verification error details: no valid A records found for mydomain.com; no valid AAAA records found for mydomain.com
[Mon Aug 11 17:23:37 CST 2025] Please check log file for more details: /root/.acme.sh/acme.sh.log
阿里云解析记录只有一个 www
子域的 A 记录指向了 23.239.20.47
,但是没有给根域名 gitweixin.com
添加 A 记录。
Let’s Encrypt 在验证时会分别检查:
-
mydomain.com
(根域名) -
www.mydomain.com
(子域名)
你现在只有 www
的解析,所以根域名那一条验证必然失败,就会出现:
no valid A records found for mydomain.com
解决方案
-
在域名提供商域名解析中添加根域名的 A 记录
-
主机记录:
@
-
记录类型:
A
-
记录值:(你的 Linode VPS IP)
-
TTL:10分钟
-