安装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