使用 acme.sh 和 Cloudflare 获取免费 HTTPS 证书

1. 环境准备

  • 一个域名(已托管在 Cloudflare)
  • 开通 Cloudflare 账号并获取 API Token

2. 安装 acme.sh

首先,我们需要安装 acme.sh。这个工具使用非常简单,可以帮我们直接申请 Let’s Encrypt 或 ZeroSSL 等的免费证书。

运行以下命令来安装 acme.sh

1
curl https://get.acme.sh | sh

这条命令会将 acme.sh 安装到你的主目录下的 .acme.sh 目录中,并且自动配置好环境变量。

检查安装是否成功:

1
~/.acme.sh/acme.sh --version

如果显示版本号,那说明安装成功!


3. 配置 Cloudflare API Token

在 Cloudflare 获取 API Token:

  1. 登录到你的 Cloudflare 账号。
  2. 进入 API Tokens 页面,创建一个新的 Token。
  3. 为 Token 设置以下权限:
    • Zone:DNS - Edit
  4. 选择需要的域名,或者可以直接选择所有域

生成后,复制这个 Token,我们接下来会用到它。

设置 Cloudflare API Token 到 acme.sh:

在终端中,运行以下命令,将 Token 添加到 acme.sh 的配置中:

1
2
export CF_Token="你的API Token"
export CF_Account_ID="你的Cloudflare账号ID" # (可选,通常 acme.sh 会自动识别)

这一步完成后,acme.sh 就可以通过 Cloudflare API 自动配置你的域名 DNS 记录来验证域名所有权了。


4. 使用 acme.sh 申请证书

接下来就是证书的申请了,这里我们以 yourdomain.com 为例。

1
~/.acme.sh/acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com

上面的命令会为 yourdomain.com*.yourdomain.com(泛域名)申请证书。这样就可以用于你的主域名和所有子域名了!

证书生成后,acme.sh 会自动将证书文件存放到 ~/.acme.sh/yourdomain.com/ 目录中。


5. 配置 Nginx 使用 HTTPS

将证书文件安装到 Nginx 目录:

1
2
3
4
~/.acme.sh/acme.sh --install-cert -d yourdomain.com \\
--key-file /etc/nginx/ssl/yourdomain.com.key \\
--fullchain-file /etc/nginx/ssl/yourdomain.com.cer \\
--reloadcmd "systemctl reload nginx"

这条命令会把证书文件复制到 /etc/nginx/ssl/ 下,并且每次更新证书后会自动重载 Nginx 配置。

编辑 Nginx 配置文件:

打开你的网站配置文件,比如 /etc/nginx/conf.d/yourdomain.com.conf,增加 HTTPS 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 443 ssl;
server_name yourdomain.com;

ssl_certificate /etc/nginx/ssl/yourdomain.com.cer;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;

# 推荐的SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
proxy_pass http://localhost:8080; # 如果有后端应用可以配置
}
}

# 自动跳转 HTTP 到 HTTPS
server {
listen 80;
server_name yourdomain.com;

location / {
return 301 https://$host$request_uri;
}
}

保存并退出后,重启 Nginx 以应用新的配置:

1
sudo systemctl restart nginx

6. 设置证书自动续期的定时任务

Let’s Encrypt 的证书有效期为 90 天,为了避免证书过期,需要设置自动续期任务。

使用 acme.sh 的自动续期功能:

acme.sh 会默认添加一个自动续期的任务,检查所有证书的有效期并自动更新。所以一般情况下我们不需要手动创建定时任务。如果你想手动确认,可以执行以下命令:

1
~/.acme.sh/acme.sh --cron --home ~/.acme.sh

这条命令会检查证书是否需要更新,并在需要时自动更新证书。


7. 检查 HTTPS 是否生效

完成以上步骤后,访问 https://yourdomain.com 检查是否生效。浏览器应该会显示安全的 HTTPS 标志。