用 VPS + acme.sh 免费开启 HTTPS 的实战手册(亲试可用)

我的服务器是一台独立的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 

解决方案

  1. 在域名提供商域名解析中添加根域名的 A 记录

    • 主机记录:@

    • 记录类型:A

    • 记录值:(你的 Linode VPS IP)

    • TTL:10分钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大模型大数据攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值