雅云 - SSL自动更新(acme.sh)

概述

  • 雅云服务器上所有的http服务大部分使用不带ssl的普通 http 端口访问,在 WAF 上再包裹为 https,所以只更新 WAF 上对应的证书,WAF主机上执行重载命令即可。

  • 单独创建一台主机用于证书管理:ACME(Ubuntu server 24.04 LTS)。系统主要有两个功能:

    1.执行 acme.sh 脚本,并使用 cronjob 来自动更新证书;

    2.开启NFS共享。

    WAF上通过配置装载该 NFS 共享文件来使用证书,其他主机同理;可直接挂载,也可通过 docker volume 挂载。

  • 个别服务会在本地也使用 https 访问,例如镜像服务:mirrors.yacloud.net,原因是在防火墙内部使用了内网DNS映射,即在雅云网络下会将 mirrors.yacloud.net 解析为内网地址,所以也需要在内网服务上开启 https访问,并且和 WAF 的证书保持一致。

安装acme.sh

apt update && apt install -y socat cron
git clone https://git.yacloud.net/yacloud/acme.sh 
cd acme.sh && ./acme.sh --install
source ~/.bashrc && acme.sh --register-account -m szgs@yacloud.net

acme.sh 快速入门

  1. 配置阿里云授权码(从阿里云-控制台获取),设置Ali_Key和Ali_Secret(首次使用设置,此后acme.sh会将这两个值保存)
export Ali_Key=XXX
export Ali_Secret=XXX
  1. 证书申请(需要为多个域名申请证书使用 -d 参数进行配置),域名验证使用 DNS-01 方式
acme.sh --issue --dns dns_ali -d yacloud.net -d www.yacloud.net
  1. 证书申请成功后,可直接部署至本机,并且指定重载命令:
  acme.sh --install-cert -d yacloud.net -d www.yacloud.net \
    --key-file /root/safeline/resources/nginx/certs/cert_2.key \
    --fullchain-file /root/safeline/resources/nginx/certs/cert_2.crt \
    --reloadcmd 'docker exec safeline-tengine nginx -s reload'
  1. 也可通过 ssh 部署至远程主机:
  export DEPLOY_SSH_USER="root"
  export DEPLOY_SSH_SERVER=172.168.100.4
  export DEPLOY_SSH_KEYFILE=/root/safeline/resources/nginx/certs/cert_2.key
  export DEPLOY_SSH_FULLCHAIN=/root/safeline/resources/nginx/certs/cert_2.crt
  export DEPLOY_SSH_REMOTE_CMD="docker exec safeline-tengine nginx -s reload"
  export DEPLOY_SSH_BACKUP=no
  export DEPLOY_SSH_MULTI_CALL="yes"
  
  acme.sh --deploy -d yacloud.net -d www.yacloud.net --deploy-hook ssh

NFS 客户端

  • 需要使用 NFS 进行挂载的系统必须安装 NFS 相应模块

  • Ubuntu

    apt install -y nfs-common
  • OpenEuler

    dnf install -y nfs-utils

docker compose配置使用 nfs(示例)

services:
  mirrors-web:
    image: nginx
    container_name: web
    volumes:
      - nfs-share:/etc/nginx/certs

volumes:
  nfs-share:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.2,nolock,soft,nfsvers=3
      device: ":/share"

其他命令

  • 检查证书信息:openssl x509 -in cert.pem -noout -text

  • 重载 WAF:docker exec safeline-tengine nginx -s reload

  • 挂载 NFS 共享文件:mount -t nfs -o vers=3 192.168.1.2:/share /local/share

  • 取消挂载 NFS:umount 192.168.1.2:/share