 
            使用 Docker Compose 配置 Certbot 生成 SSL 证书并自动续费
使用 Docker Compose 配置 Certbot 生成 SSL 证书并自动续费
简介: 在这篇博客中,我们将详细展示如何使用 Docker 配置 Certbot 来生成 SSL 证书,并确保证书在到期时自动续期。我们会以您提供的配置情况为基础,展示每一步详细操作,确保您可以顺利配置。
步骤 1:准备工作
- 确保你有一个有效的域名:你需要一个有效的域名(如 - blog.anqin.cc和- www.blog.anqin.cc),并且能够配置 DNS 记录,指向你的服务器。确保 DNS 记录指向正确的服务器 IP 地址。
- 安装 Docker 和 Docker Compose: 
- 如果没有安装 Docker,请参考 Docker 官方安装文档。 
- 安装 Docker Compose,请参考 Docker Compose 安装文档。 
步骤 2:创建 Docker Compose 配置文件
在你的项目文件夹中创建 docker-compose.yml 文件。这个文件定义了两个服务:Nginx 和 Certbot。
version: "3"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/log:/var/log/nginx
      - ./nginx/cert:/etc/nginx/cert
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    ports:
      - 80:80
      - 443:443
    depends_on:
      - certbot
  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew && nginx -s reload; sleep 12h & wait $${!}; done;'"
在这个 docker-compose.yml 文件中,Nginx 和 Certbot 都被配置为服务。关键配置如下:
- Nginx:用于处理 HTTP 请求,并将 - .well-known/acme-challenge路径的请求转发到 Certbot 用于验证的目录。
- Certbot:负责请求并生成 SSL 证书,配置了 - entrypoint,每 12 小时自动续期证书,并在证书更新后重载 Nginx。
步骤 3:配置 Nginx
创建一个 nginx.conf 配置文件,确保 Nginx 能够正确地处理 HTTP-01 验证。
server {
    listen 80;
    server_name blog.anqin.cc;
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    location / {
        proxy_pass http://backend_service;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
关键点:
- /.well-known/acme-challenge/路径的请求会被 Nginx 转发到 Certbot 用来验证域名所有权的目录- /var/www/certbot。
- 在证书申请通过后,我们会修改配置文件来启用 HTTPS(443 端口)。 
步骤 4:启动 Docker Compose
使用以下命令启动 Nginx 和 Certbot 容器:
这个命令会在后台启动 Nginx 和 Certbot 服务。
步骤 5:请求 SSL 证书
当 Nginx 容器和 Certbot 容器成功启动后,接下来你可以请求 SSL 证书。请使用以下命令请求证书。
docker compose run --rm certbot certonly --webroot -w /var/www/certbot -d blog.anqin.cc
解释:
- certonly:表示只获取证书,而不安装证书。
- --webroot -w /var/www/certbot:指定 Certbot 使用- webroot插件来验证证书,通过指定的路径- /var/www/certbot存放验证文件。
- -d:后续跟域名,用于指定需要申请证书的域名。
步骤 6:配置 Nginx 使用 SSL 证书
成功获取证书后,你需要更新 Nginx 配置文件,以便使用生成的证书。修改 nginx.conf,配置 Nginx 启用 HTTPS:
server {
    listen 443 ssl;
    server_name blog.anqin.cc;
    ssl_certificate /etc/letsencrypt/live/blog.anqin.cc/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.anqin.cc/privkey.pem;
    location / {
        proxy_pass http://backend_service;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
关键点:
- 使用 Certbot 生成的证书和私钥路径 - /etc/nginx/cert/fullchain.pem和- /etc/nginx/cert/privkey.pem。
- 设置 SSL 加密。 
步骤 7:重新加载 Nginx 配置
在 Nginx 配置完成后,重新加载 Nginx,使新的配置生效:
docker compose restart nginx步骤 8:配置证书自动续期
Certbot 提供了自动续期机制,你可以通过创建定时任务(Cron Job)来定期运行 certbot renew 命令,确保证书不会过期。为了让 Docker 容器自动续期证书并在证书更新后重载 Nginx,我们在 certbot 服务的 entrypoint 中添加了自动续期配置:
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew && nginx -s reload; sleep 12h & wait $${!}; done;'"
这个配置会每 12 小时检查一次证书是否需要续期。如果需要续期,Certbot 会更新证书并触发 Nginx 重新加载。
步骤 9:验证自动续期
你可以手动运行以下命令来测试证书续期是否正常工作:
docker compose run --rm certbot renew
如果证书已更新,Nginx 会自动重新加载,以使新证书生效。
总结
通过以下几个步骤,你就可以成功地在 Docker 中配置 Certbot 生成 SSL 证书并设置自动续期:
- 创建 Docker Compose 配置:为 Nginx 和 Certbot 配置容器,并连接到一起。 
- 配置 Nginx:使 Nginx 可以处理 - .well-known/acme-challenge路径的验证请求。
- 请求 SSL 证书:使用 Certbot 获取 SSL 证书并配置到 Nginx。 
- 配置自动续期:确保 Certbot 每 12 小时检查证书是否到期,自动续期证书并重载 Nginx。 
通过这种方式,你的证书会在到期前自动续期,并且服务会始终保持 HTTPS 安全连接。
- 感谢你赐予我前进的力量
                                
                                
                                    
 
            
        

 
                 
                         
                         
                         
                         
                         
                         
                 
                 
            