使用acme.sh为个人博客配置免费SSL证书并实现自动续期(完整教程)

使用acme.sh为个人博客配置免费SSL证书并实现自动续期(完整教程)

告别90天手动续期,一次配置永久自动续签

为什么需要这篇文章?

最近几年,SSL证书的有效期越来越短。DigiCert免费证书从1年缩短到3个月,付费证书也缩短到200天左右。对于个人博客站长来说,这意味着每3个月就要手动申请一次证书,非常麻烦。

有没有一种方法,既能完全免费,又能自动续期,再也不用操心证书过期的问题?

答案是:acme.sh + Let’s Encrypt

什么是acme.sh?

acme.sh是一个纯Shell脚本编写的ACME协议客户端,它可以帮助你:

  • 自动从Let’s Encrypt申请免费证书
  • 支持单域名、多域名、泛域名证书
  • 自动续期(这是最核心的功能)
  • 支持各种DNS服务商的API验证
  • 轻量级,无依赖,安装包仅几百KB

本教程适用环境

  • 服务器:Linux(CentOS/Ubuntu/Debian等)
  • Web服务器:Nginx(Apache也支持)
  • 域名:已解析到服务器IP
  • 知识要求:会基本的Linux命令即可

第一步:安装acme.sh

登录你的服务器SSH,执行以下命令:

bash

curl https://get.acme.sh | sh -s email=your_email@example.com

your_email@example.com替换成你的真实邮箱(用于紧急续期通知)。

安装完成后,需要重新加载Shell配置:

bash

source ~/.bashrc

验证安装

bash

acme.sh --version

看到版本号说明安装成功。

自动创建的定时任务

bash

crontab -l | grep acme

你会看到类似这样的输出:

text

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

这意味着acme.sh每天都会检查证书有效期,发现快要过期时自动续期。


第二步:选择证书颁发机构(CA)

acme.sh默认使用ZeroSSL,但ZeroSSL有时会有请求频率限制。建议切换到更稳定的Let’s Encrypt

bash

acme.sh --set-default-ca --server letsencrypt

第三步:申请证书(两种方式)

根据你的需求,选择其中一种方式即可。

方式A:单域名证书(适用于只有一个主域名)

如果你的网站只有一个域名,比如example.com

bash

acme.sh --issue -d example.com -w /var/www/html

这里的/var/www/html是你的网站根目录,acme.sh会在该目录下创建临时验证文件。

方式B:泛域名证书(强烈推荐)

如果你以后可能会添加子域名(如blog.example.comapp.example.com),建议直接申请泛域名证书

bash

# 泛域名证书必须通过DNS验证
acme.sh --issue --dns -d example.com -d "*.example.com"

但是这种方式需要手动添加DNS TXT记录,比较麻烦。更好的做法是使用DNS API自动验证(见下文)。


第四步:使用DNS API自动验证(推荐)

如果你使用主流DNS服务商,acme.sh可以自动添加/删除DNS验证记录,全程无需手动操作

以阿里云为例

  1. 在阿里云创建AccessKey
    • 登录阿里云控制台 → RAM访问控制
    • 创建子账号,授权AliyunDNSFullAccess
    • 保存AccessKey ID和AccessKey Secret
  2. 设置环境变量并申请证书

bash

export Ali_Key="你的AccessKey ID"
export Ali_Secret="你的AccessKey Secret"

# 申请泛域名证书
acme.sh --issue --dns dns_ali -d example.com -d "*.example.com"

第一次运行会自动调用阿里云API添加TXT记录,验证完成后自动删除,全程自动化。

其他DNS服务商

acme.sh支持几乎所有主流DNS服务商:

服务商参数所需环境变量
阿里云dns_aliAli_KeyAli_Secret
腾讯云dns_dpDP_IdDP_Key
Cloudflaredns_cfCF_KeyCF_Email
华为云dns_huaweicloudHUAWEICLOUD_UsernameHUAWEICLOUD_PasswordHUAWEICLOUD_DomainName
DNSPoddns_dpDP_IdDP_Key

第五步:安装证书到Nginx

申请成功后,需要将证书安装到Nginx配置中。

1. 找到你的Nginx配置文件

bash

# 查看Nginx主配置文件位置
nginx -t
# 通常会显示类似:configuration file /etc/nginx/nginx.conf test is successful

站点配置文件通常在/etc/nginx/conf.d/目录下:

bash

ls -la /etc/nginx/conf.d/

找到你域名对应的配置文件,比如example.com.conf

2. 安装证书

bash

sudo acme.sh --install-cert -d example.com \
    --key-file       /etc/ssl/private/example.com.key \
    --fullchain-file /etc/ssl/certs/example.com.pem \
    --reloadcmd      "sudo systemctl reload nginx"

参数说明

  • --key-file:私钥保存路径
  • --fullchain-file:完整证书链保存路径
  • --reloadcmd:安装成功后执行的命令(重载Nginx)

如果遇到权限问题(Permission denied),直接加sudo

bash

sudo acme.sh --install-cert -d example.com \
    --key-file       /etc/ssl/private/example.com.key \
    --fullchain-file /etc/ssl/certs/example.com.pem \
    --reloadcmd      "sudo systemctl reload nginx"

3. 验证证书是否成功安装

bash

# 查看证书有效期
openssl x509 -in /etc/ssl/certs/example.com.pem -noout -dates

# 查看证书包含的域名
openssl x509 -in /etc/ssl/certs/example.com.pem -text | grep -A1 "Subject Alternative Name"

如果是泛域名证书,应该能看到DNS:example.com, DNS:*.example.com