docker-compose 中使用 acme.sh 来申请和管理证书,需要将 acme.sh 的功能集成到 Docker 容器中。以下是具体步骤和使用方法:


1. 准备工作

  • 确保你的服务器上已经安装了 dockerdocker-compose
  • 确定需要为哪些域名申请证书。
  • 确保你的域名已经解析到服务器(DNS A 记录或 CNAME 记录设置正确)。
  • 如果使用 DNS 验证方式,需要获取你的 DNS 服务商的 API 密钥。

2. 获取 acme.sh Docker 镜像

acme.sh 官方提供了一个 Docker 镜像,可以直接运行 acme.sh 脚本:

docker pull neilpang/acme.sh

这个镜像包含了 acme.sh,可以用来申请、验证和管理证书。


3. docker-compose.yml 中配置 acme.sh

下面是一个示例 docker-compose.yml 文件,用于运行 acme.sh 容器:

version: "3.8"

services:
  acme:
    image: neilpang/acme.sh
    container_name: acme_cert
    environment:
      - CF_Key=your_cloudflare_api_key  # Cloudflare的API Key(如果用DNS验证)
      - [email protected] # Cloudflare账号邮箱(如果用DNS验证)
    command: >
      --issue
      --dns dns_cf
      -d example.com
      -d *.example.com
    volumes:
      - ./certs:/acme.sh/certs
    restart: unless-stopped

4. 配置说明

  1. 环境变量:

    • CF_KeyCF_Email 是 Cloudflare 的 DNS API 密钥和账号邮箱。如果使用其他 DNS 服务商,请参考 acme.sh 的文档修改相应的环境变量。例如,阿里云的 DNS 需要设置 Ali_KeyAli_Secret
    • 如果使用 HTTP 验证,可以省略这些环境变量。
  2. 命令部分:

    • --issue:表示申请证书。
    • --dns dns_cf:使用 DNS 验证方式(这里以 Cloudflare 为例)。
    • -d example.com -d *.example.com:为主域名和泛域名申请证书。
    • 如果你使用 HTTP 验证,可以改为以下命令:

      command: >
        --issue
        -w /path/to/webroot
        -d example.com
  3. 卷挂载(volumes):

    • ./certs:/acme.sh/certs:将生成的证书保存到主机的 ./certs 目录中,你可以将证书挂载到其他需要的服务中(如 Nginx 或 Traefik)。
  4. 自动续期:
    acme.sh 容器本身不会自动运行续期任务,但可以通过 crondocker-compose 定期重启来触发续期。或者手动在容器中运行以下命令:

    docker exec -it acme_cert --renew -d example.com

5. 完整示例:与 Nginx 配合

如果你希望把申请的证书直接与 Nginx 服务配合,以下是一个完整的 docker-compose.yml 示例:

version: "3.8"

services:
  acme:
    image: neilpang/acme.sh
    container_name: acme_cert
    environment:
      - CF_Key=your_cloudflare_api_key
      - [email protected]
    command: >
      --issue
      --dns dns_cf
      -d example.com
      -d *.example.com
    volumes:
      - ./certs:/acme.sh/certs
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/nginx/certs:ro
    ports:
      - "80:80"
      - "443:443"
    restart: unless-stopped

nginx.conf 示例:

server {
    listen 80;
    server_name example.com www.example.com;

    # Redirect HTTP to HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/nginx/certs/example.com/fullchain.cer;
    ssl_certificate_key /etc/nginx/certs/example.com/example.com.key;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

6. 启动服务

在配置好 docker-compose.yml 文件和相关配置文件后,启动服务:

docker-compose up -d
  1. 首次申请证书

    • acme.sh 容器会自动申请证书,并将其存储在 ./certs 目录中。
  2. 检查证书是否生成成功

    ls ./certs/example.com/

    你应该能看到类似以下文件:

    • fullchain.cer:完整的证书链。
    • example.com.key:私钥。
  3. 访问 HTTPS 网站:
    启用 HTTPS 后,可以通过浏览器访问 https://example.com 来验证配置是否成功。

7. 证书续期

  • acme.sh 的证书有效期为 90 天。acme.sh 自带自动续期功能,可以通过挂载到主机的 cron 来触发续期,或者定期重启容器来申请新的证书。
  • docker-compose.yml 中,你可以设置一个定期运行的任务来手动触发续期操作。

例如,每月通过 cron 定期重启 acme.sh 容器:

docker-compose run acme --renew -d example.com

总结

通过 docker-compose 使用 acme.sh 可以轻松实现自动化证书申请和管理,特别是在使用反向代理服务器(如 Nginx 或 Traefik)时非常方便。根据你的实际需求,选择适合的验证方式(DNS 或 HTTP),并确保证书续期任务能够正常运行,从而实现 HTTPS 的长期维护。

标签: Docker, SSL

评论已关闭