menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

使用acme.sh自动续签https证书

作者:Chancel Yang, 创建:2024-03-29, 字数:2287, 已阅:137, 最后更新:2024-03-29

Acme.sh是一个开源的轻量级Shell脚本,用于自动化管理和部署SSL证书

由于服务器经常一年一换,借助docker来部署运行acme.sh会更方便前期

首先编辑一个docker-compose.yaml文件:

YAML
version: '3'

services:
  acme.sh:
    image: neilpang/acme.sh
    volumes:
      - ./acmesh:/acme.sh
    environment:
      - GD_Key=[your godaddy key]
      - GD_Secret=[your godaddy secret]
      - HTTP_PROXY=http://192.168.1.2:8080
      - HTTPS_PROXY=http://192.168.1.2:8080
    command: '--issue --dns dns_gd -d "*.chancel.me" -d "chancel.me" --server letsencrypt --renew --log --debug 2'

这里使用的是neilpang/acme.sh镜像,然后添加一些处理:

  • 将当前路径下的acmesh目录作为镜像存放数据的卷,这样每次运行都可以自动续签证书
  • 添加了访问godaddy的api的魔法网络代理
  • command命令中添加了日志与详细的debug输出
  • command命令中看到分别申请了*.chancel.mechancel.me,这是因为*.chancel.me并不包含裸域名chancel.me

运行该容器

Bash
sudo docker-compose up

检查输出没有错误后,可以检阅一下当前目录的文件,如下:

TEXT
chancel@nuc8i5 ~/docker/acme.sh$ tree                                                                                            
.
├── acmesh
│   ├── account.conf
│   ├── acme.sh.log
│   ├── ca
│   │   ├── acme-v02.api.letsencrypt.org
│   │   │   └── directory
│   │   │       ├── account.json
│   │   │       ├── account.key
│   │   │       └── ca.conf
│   │   └── acme.zerossl.com
│   │       └── v2
│   │           └── DV90
│   │               └── account.key
│   ├── *.chancel.me_ecc
│   │   ├── ca.cer
│   │   ├── *.chancel.me.cer
│   │   ├── *.chancel.me.conf
│   │   ├── *.chancel.me.csr
│   │   ├── *.chancel.me.csr.conf
│   │   ├── *.chancel.me.key
│   │   └── fullchain.cer
│   ├── chancel.me_ecc
│   │   ├── chancel.me.conf
│   │   ├── chancel.me.csr
│   │   ├── chancel.me.csr.conf
│   │   └── chancel.me.key
│   └── http.header
└── docker-compose.yml

9 directories, 19 files

其中,*.chancel.me_ecc里的*.chancel.me.keyfullchain.cer就是证书文件

如果你需要裸域名和泛域名支持,需要在命令行中像我一样分别指定,这样生成出来的证书文件是包括了泛域名和裸域名的

可以通过openssl工具检查:

Bash
openssl x509 -in fullchain.cer -text -noout

检查输出中 "X509v3 Subject Alternative Name" 这一行是否包含了指定的2个域名参数,如下:

TEXT
Certificate:
    Data:
        ...
        X509v3 extensions:
            ...
            X509v3 Subject Alternative Name: 
                DNS:*.chancel.me, DNS:chancel.me
            ...
    ...

可以看到,DNS中包含了泛域名*.chancel.me也包括了裸域名chancel.me

然后将docker-compose添加到crontab任务中就可以在证书到期前30天自动更新


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]