2024最新版利用acme申请免费https/SSL证书


本文将介绍如何利用acme.sh申请免费的HTTPS/SSL证书

说明

  • 本文仅供学习交流使用,如果本文与官方文档有出入,请以官方文档为准
  • 新版acme.sh的默认提供商已从letsencrypt改为了ZeroSSL,所以需要去zeroSSL官网先注册一个账号,当然你也可以用回letsencrypt,这个就无需注册,后面会讲到如何切换提供商,请自行翻看

安装脚本

1
curl https://get.acme.sh | sh -s [email protected]

1
wget -O -  https://get.acme.sh | sh -s [email protected]

生成证书

acme.sh提供两种方式,一个是HTTP,一个是DNS,如果需要申请泛域名证书,如*.youdomain.com则只能选择DNS模式

HTTP模式

HTTP方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了,所以需要先部署一个可访问的服务,然后用以下命令申请

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot 网站根目录(如:/home/wwwroot/mydomain.com/)

如果是nginx或apache部署的可以使用以下命令

1
acme.sh --issue -d mydomain.com --(nginx或apache)

acme.sh 会智能的从对应服务器配置中自动完成验证

DNS模式

DNS方式是在域名上添加一条 txt 解析记录, 验证域名所有权

CF

  • 1、申请CF_Token:访问cloudflare 个人账户,点击创建令牌,使用编辑区域 DNS模板,进行如下配置:
    1
    2
    3
    4
    5
    6
    7
    8
    权限:
    区域 DNS 编辑
    账户 账户设置 读取
    区域 区域 读取
    账户资源:
    包括 您的账户
    区域资源:
    包括 特定资源 选中特定域名
    然后点击下一步预览,在下一步即可生成复制备用
  • 2、获取CF_Account_ID:打开cloudflare,链接后面那串就是所需要的id,复制备用
  • 3、连接SSH然后输入:
    1
    2
    3
    export CF_Token="你准备的CF_Token"
    export CF_Account_ID="你准备的CF_Account_ID"
    acme.sh --issue --dns dns_cf -d youdomain.com # 通配符可填写*.youdomain.com
    然后就是等待,成功的话你会看到一堆success

DNSPOD

  • 1、登陆自己的 DNSPod 帐户,点击自己头像,选择密钥管理,添加一个密钥,将 ID 和 Token 记录下来
  • 2、连接SSH然后输入
    1
    2
    3
    export DP_Id="你准备的id"
    export DP_Key="您准备的Token"
    acme.sh --issue --dns dns_dp -d youdomain.com -d *.youdomain.com

copy/安装 证书

acme.sh默认生成的证书都放在安装目录下: ~/.acme.sh/, 官方建议不要直接使用此目录下的文件,最好使用--install-cert命令,并指定目标位置, 然后证书文件会被copy到相应的位置,以下是nginx例子:

1
acme.sh --install-cert -d youdomain.com --key-file 你的证书存放路径/cert.key --fullchain-file 你的证书存放路径/cert.pem --reloadcmd "service nginx force-reload"

查看已安装证书信息

1
acme.sh --info -d youdomain.com

切换证书提供商

acme.sh支持多个CA提供商,包括但不限于:ZeroSSL.com CA(default)、Letsencrypt.org CA、BuyPass.com CA、SSL.com CA、Google.com Public CA,如果想把默认提供商切换成letsencrypt则使用以下命令

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

只是申请某个域名证书使用请请使用:

1
acme.sh --issue --dns dns_cf -d youdomain.com --server letsencrypt

更新证书

目前acme.sh会自动更新, 你无需任何操作。工作原理主要是使用系统定时任务执行脚本相关任务,如果想查看可以使用以下命令:

1
crontab -l

更新脚本

手动升级到最新版 :

1
acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

1
acme.sh  --upgrade  --auto-upgrade

之后,acme.sh就会自动保持更新了。
如果你想关闭自动更新:

1
acme.sh --upgrade  --auto-upgrade  0

其他

  • export命令导出相关参数只会在创建的时候展示,后续不会展示,请注意保存
  • 通过export命令导出的可复用的值会保存在~/.acme.sh/account.conf
  • 如果执行acme.sh报错,可以使用全路径/root/.acme.sh/acme.sh

我的nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443 ssl;
server_name youdomain;
root 网站根目录;
ssl_certificate "你的证书导出路径/cert.pem";
ssl_certificate_key "你的证书导出路径/cert.key";
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

location / {
index index.html;
proxy_cache my_cache;
}
}

参考