安装acme.sh
curl https://get.acme.sh | sh -s email=my@example.com
创建 一个 bash 的 alias方便你使用
alias acme.sh=~/.acme.sh/acme.sh
注册(可选)
acme.sh --register-account -m my@example.com
使用DNS API方式申请
- 不需要TCP 80端口
- 不需要WEB服务器
- 不需要公网IP
导入DNS API:
签发泛域名证书是最好的方式了,申请一个证书任意二级域名都可以使用,非常方便。
根据你的域名服务商提供的DNS API,并导入DNS API,各域名服务商的DNS API请参考官方说明:https://github.com/Neilpang/acme.sh/tree/master/dnsapi
这里以CloudFlare为例,在CloudFlare的控制台里找到自己的DNS API,然后使用以下命令导入到acme.sh中:
export CF_Token="yp1dgAKdzglvUUuOBlXqDML2U886eQwiZ******"
export CF_Zone_ID="e554bfdafd90d1671303d543c*******"
这个DNS API信息会保存在“~/.acme.sh/account.conf”文件中。
2、申请泛域名证书:
导入域名商的DNS API之后就可以使用以下命令,自动解析DNS(通过api给你的域名添加一条txt解析记录),验证通过后就会下发证书:
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
【可选】默认证书提供商是ZeroSSL ECC,可以添加--server letsencrypt
更换为letsencrypt,或者
acme.sh --set-default-ca --server letsencrypt
证书申请成功后,默认保存在“~/.acme.sh/example.com_ecc”目录下。注意:“dns_cf”表示使用CloudFlare的DNS API,域名商不同的话此处会不同,请参考上述文档。
默认生成的证书都放在安装目录下: ~/.acme.sh/
中的/root/.acme.sh/example.com_ecc/example.com.cer
和/root/.acme.sh/example.com_ecc/example.com.key
但是不要在web服务器中直接引用目录下的证书文件,也不要手动来拷贝证书文件到具体的web服务器中,手动拷贝会导致之后更新证书流程不能完全自动。
正确方式是使用acme.sh的安装证书命令,acme.sh自动拷贝证书文件到具体目录中,拷贝命令会被记录下来,之后自动更新证书流程也会执行此拷贝步骤,从而实现更新证书流程的完全自动化。
创建目录
mkdir /etc/nginx/ssl
acme.sh的安装证书命令
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.cer \
--reloadcmd "service nginx force-reload"
配置nginx
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
root /var/www/example.com;
index index.html index.htm index.php;
#location / {
#proxy_pass http://127.0.0.1:41277;
#proxy_redirect off;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#}
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_certificate /etc/nginx/ssl/example.com.cer;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
}
重启nginx生效
systemctl restart nginx
更新证书
目前证书在 60 天以后会自动更新,你无需任何操作,因为在acme.sh安装时,已经把相关的自动更新程序写入到crontab中,如果想要查看,可以通过以下命令:
crontab -l
输出内容包含一个自动更新程序,大致内容如下:
40 18 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
停止自动更新(移除域名证书)
acme.sh --remove -d example.com
升级ACME
acme.sh --upgrade
查看acme.sh已签发证书的域名:
acme.sh --list
删除acme.sh:
acme.sh --uninstall