用cerbot自动更新docker里caddy的证书

warning: 这篇文章距离上次修改已过440天,其中的内容可能已经有所变动。

用cerbot自动更新docker里caddy的证书

一、背景

一个小项目,使用了ssl加密访问web服务。之前用nginx+zeroSSl来免费白嫖证书,每三个月换一次,用了大概一年左右,这次再续期时,竟然提示我You have reached the maximum amount of 90-day certificates allowed on the Free Plan.。好家伙,不给你玩了!

image-20230909230913151

为了这不赚钱的小项目去买证书是不可能的,转caddy去,之前用v2xx+caddy+ssl搭建科学上网就很好的解决了证书问题。不过那都是在主机里运行的,这次有点不一样,caddy是运行在docker里的。

二、准备工作

  • 安装certbot
    apt install certbot
  • 安装caddy容器

    这里我用的是docker-swarm编排文件deploy.yml,其中Caddyfile配置文件需要自己建。

      caddy:
        image: caddy
        restart: unless-stopped
        ports:
          - "6000:80"
          - "4000:443"
           
        volumes:
          - /home/docker/caddy/Caddyfile:/etc/caddy/Caddyfile
          - /home/docker/caddy/site:/srv
          - /home/docker/caddy/caddy_data:/data
          - /home/docker/caddy/caddy_config:/config
    

    完成后,docker-compose -f deploy.yml up -d ==-d== 表示后台运行。这里也给出Caddyfile的简单配置信息吧,每个人的需求不一样,需要根据情况修改。

    {
     http_port 80
      debug
      https_port 443
    }
    
    xx.xxx.cn  {
     # tls mail@qq.com
     #这里是获取到证书后才引用的
    tls cert.pem privkey.pem
    #hanlde /test {
     #  respond "this is test"
      #}
      root * /srv
      file_server browse
    

三、获取证书

对于获取证书,之前我有写过, certbot certonly 自动获取证书非80端口的坑。当时使用的是自动校验域名的方式,还踩了坑。由于项目所在外网不开放80端口,这次采用dns的方式来验证。

certbot --manual --preferred-challenges dns certonly根据向导确认,后面会生成一个acme字符串和值,到dns域名控制台,新建一个txt记录,粘贴进去即可,这个写得很好(https://blog.csdn.net/qq_36840228/article/details/121038844)我就不重复了。获取到的证书 在/etc/letsencrypt/live/你的域名文件夹下,我们只需要cert.pem,privkey.pem。

把上面两个文件复制到网站的根目录下,将handle /test注释去掉,保存重启caddy,测试xx/test,能看到消息说明证书正常。

四、设置自启动及自动更新证书

由于certbot与caddy不在同一环境里,tls xxx@xx.com 自然不生效的,所以才需要手动指定tls证书。我这里是将certbot生成的证书直接放到caddy网站根目录,然后用certbot renew去更新证书,最后再用crontab来设置每5天更新一次证书,然后自动重启caddy。

crontab -e进入编辑,增加两行,一行是每次系统重启执行,一行是每5天执行一次。

@reboot /home/docker/update_cert/auto_update.sh &
* * */5 * * /home/docker/update_cert/auto_update.sh &

shell代码如下:

echo "$(date) start now.." >> log.txt
certbot renew >>log.txt
docker restart `docker ps |grep caddy |awk '{print $1}'` >> log.txt
echo "$(date) end!"

这样设置之后就能愉快的玩耍了!

none
最后修改于:2023年09月10日 01:33

评论已关闭