acme.sh 使用教程
使用 Acme.sh 自动生成和续签免费 SSL 证书
Acme.sh 是一个开源的脚本,能够从 ZeroSSL、Let’s Encrypt 等证书颁发机构(CA)获取免费的 HTTPS 证书。该脚本特别简单易用,并且支持多种验证方式。下面将详细介绍使用 Acme.sh 生成、安装和更新证书的各个步骤。
1. 安装 Acme.sh
安装 Acme.sh 可以通过简单的命令实现,并且不限制于 root 用户。普通用户也能顺利完成安装。
命令安装:需要服务器能正常访问github
curl https://get.acme.sh | sh -s email=my@example.com
或
wget -O - https://get.acme.sh | sh -s email=my@example.com
从 GitHub 安装:
curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m my@example.com
或
wget -O - https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m my@example.com
git clone 并安装:(推荐)
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
高级安装:
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install \
--home ~/myacme \
--config-home ~/myacme/data \
--cert-home ~/mycerts \
--accountemail "my@example.com" \
--accountkey ~/myaccount.key \
--accountconf ~/myaccount.conf \
--useragent "this is my client."
2. 生成证书
Acme.sh 支持 ACME 协议的所有验证方式,其中最常用的是 HTTP 验证和 DNS 验证。
HTTP 验证:
直接签发:
指定域名和网站根目录,Acme.sh 将自动在根目录下生成并删除验证文件,验证过程安全无副作用。
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
使用 Apache 模式:
Acme.sh 可以智能地从 Apache 的配置中读取信息,自动完成验证,无须指定网站根目录。
acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
使用 Nginx 模式:
同样,Acme.sh 也能智能地从 Nginx 的配置中读取信息完成验证。
acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
使用独立服务模式:
如果服务器上没有运行任何 Web 服务,且 80 端口空闲,Acme.sh 可以启动临时 Web 服务来完成验证。
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
修改默认 CA:
若遇到证书申请卡在待处理状态,尝试将 CA 服务器改为 Let’s Encrypt。
acme.sh --set-default-ca --server letsencrypt
DNS 验证:
手动验证:
若不能通过 Web 服务器自动验证,可手动在域名管理面板添加一条 TXT 记录以验证域名所有权。
acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
之后需重新生成证书:
acme.sh --renew -d example.com
自动验证(DNS API):
DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 TXT 记录,且在完成验证后删除对应的记录。
acme.sh 目前支持超过一百家的 DNS API。
以 Aliyun 为例,获取 API Key 并执行:
export Ali_Key="LTAI5**************"
export Ali_Secret="SkYA**************"
现在我们可以签发通配符证书了:
/root/.acme.sh/acme.sh --issue --dns dns_ali -d example.cn -d *.example.cn
Ali_Key
和 Ali_Secret
将保存在 ~/.acme.sh/account.conf
中,并在需要时自动获取,无需手动再设置。
更详细的 DNS API 用法: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
3. 安装证书到服务
Apache 示例:
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
Nginx 示例:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx reload"
Nginx 的配置项 ssl_certificate 需要使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否则 SSL Labs 的测试会报证书链问题(Chain issues Incomplete)。
默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 reloadcmd 传递的命令自动重载配置。
注意:reloadcmd 非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd 命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。
4. 查看已安装证书的信息
利用 Acme.sh 可以轻松查看任何已签发证书的详细信息。
acme.sh --info -d example.com
上述命令将显示证书的配置,包括证书的创建时间、下次续签时间以及用于自动更新服务配置的命令等。
5. 更新证书
证书每 60 天自动更新,无需用户手动操作。不过,也可以使用强制更新命令重新续签证书:
acme.sh --renew -d example.com --force