使用 Docker Compose 配置 Certbot 生成 SSL 证书并自动续费

简介: 在这篇博客中,我们将详细展示如何使用 Docker 配置 Certbot 来生成 SSL 证书,并确保证书在到期时自动续期。我们会以您提供的配置情况为基础,展示每一步详细操作,确保您可以顺利配置。


步骤 1:准备工作

  1. 确保你有一个有效的域名:你需要一个有效的域名(如 blog.anqin.ccwww.blog.anqin.cc),并且能够配置 DNS 记录,指向你的服务器。确保 DNS 记录指向正确的服务器 IP 地址。

  2. 安装 Docker 和 Docker Compose


步骤 2:创建 Docker Compose 配置文件

在你的项目文件夹中创建 docker-compose.yml 文件。这个文件定义了两个服务:NginxCertbot

version: "3"
<p>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</p>
<p>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;</p>
<pre><code>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;</p>
<pre><code>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 证书并设置自动续期:

  1. 创建 Docker Compose 配置:为 Nginx 和 Certbot 配置容器,并连接到一起。

  2. 配置 Nginx:使 Nginx 可以处理 .well-known/acme-challenge 路径的验证请求。

  3. 请求 SSL 证书:使用 Certbot 获取 SSL 证书并配置到 Nginx。

  4. 配置自动续期:确保 Certbot 每 12 小时检查证书是否到期,自动续期证书并重载 Nginx。

通过这种方式,你的证书会在到期前自动续期,并且服务会始终保持 HTTPS 安全连接。