跳到主要内容

使用acme.sh配置ssl证书并自动续签

·1 分钟

使用acme.sh配置SSL证书并自动续签

参考官网

Home · acmesh-official/acme.sh Wiki (github.com)

acme.sh用于生成免费的ssl证书,其完整实现了acme协议,并且由纯Shell脚本语言编写,没有过多的依赖项,安装和使用都非常方便。

支持多个ssl签发平台,如Let’s Encrypt (letsencrypt.org)Free SSL Certificates and SSL Tools - ZeroSSL

本文使用Let’s Encrypt

准备环境:

  • 域名
  • Linux版本Ubuntu22.04
  • 代理服务器Nginx1.18.0
  • acem.sh

下载安装acme.sh

curl https://get.acme.sh | sh -s email=my@example.com

使用这个安装干了些啥

  • 部署acme.sh程序到用户文件夹

  • 为脚本创建新名称 acme.sh=~/.acme.sh/acme.sh

    需重启终端,不想重启的话 .acme.sh# alias acme.sh=~/.acme.sh/acme.sh

  • 创建一个每日定时任务,用于自动更新即将过期的证书

    通过crontab -l 查看:

    18 18 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
    

安装后目录

account.conf  acme.sh  acme.sh.env  deploy  dnsapi  http.header  notify

具体命令可查看官网

使用acme.sh配置ssl证书

直接指向项目

acme.sh --issue -d example.com -d test.com -w /var/www/project

-d参数指定域名,多个域名使用多个-d参数,第一个-d参数指定的域名即证书的主体名称,其它-d参数指定的域名为证书的可选主体名称。

-w参数指定的是域名的webroot目录,以example.com为例,-w参数的值即是http://example.com对应的webroot目录。如果使用多个-d参数同时指定了多个域名,则所有这些域名必须对应同一个webroot目录;另外,当前系统用户必须具有webroot目录的写入权限。

DNS自动模式(建议)

此方法会向域名解析平台添加一个TXT记录值,需要提供对应平台的Key和Secret,具体参考acme.sh/dnsapi/dns_ali.sh at master · acmesh-official/acme.sh (github.com) 我使用的是dns_ali。

#切换默认平台为letsencrypt 其他更换最后平台即可
acme.sh --set-default-ca --server letsencrypt

默认的签发平台是ZeroSSL,我使用的时候想着就用默认的平台,可是一直报错 et authz objec with invalid status, please try again later. github上有人说是ZeroSSL的dns身份认证出问题了。This domain won’t issue · Issue #4991 · acmesh-official/acme.sh (github.com) 所以我换成了用letsencrypt

获取阿里云的Key和Secret,添加到系统环境变量

export Ali_Key="*******************"
export Ali_Secret="*********************"

生成证书

acme.sh --issue --dns dns_ali -d example.com -d www.example.com

该命令从系统变量中读取aliyun的api授权ID和密码,并通过dns_ali参数指定DNS提供商为阿里云。该命令将通过api自动为指定域名添加txt记录,并在验证完毕后自动移除txt记录。

aliyun的api授权ID和密码将被保存在.acme.sh的账户配置文件中,以供将来自动更新证书时使用,存储位置为:

~/.acme.sh/account.conf

通过 --install-cert部署证书

acme.sh --install-cert -d *.example.com \
--key-file       /etc/nginx/ssl/in/example.com.key  \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd     "nginx -s reload"

使用 acme.sh --list查看证书列表

Main_Domain   KeyLength  SAN_Domains  CA               Created               Renew
*.ihuadz.top  "ec-256"   ihuadz.top   LetsEncrypt.org  2024-02-18T04:06:07Z  2024-04-17T04:06:07Z

Nginx 部署

在项目对应的Nginx配置文件中添加

server {
    listen 443 ssl;
    server_name blog.ihuadz.top;
    root /var/www/hexo;
 
    ssl_certificate "/etc/nginx/ssl/ihuadz.top/fullchain.cer";
    ssl_certificate_key "/etc/nginx/ssl/ihuadz.top/*.ihuadz.top.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
}

访问https://blog.ihuadz.top ok。没问题

不同的项目配置不同的域名和路径即可,使用泛域名的话就不用重新申请证书