docker环境下配置cerbot获取免费ssl证书并自动续期

实践场景

本人使用docker部署了一个nginx容器,通过容器卷,实现本地html,ssl,conf和ngiinx容器映射的, 经常需要手动部署免费证书,但是现在的证书免费期3个月太短了。
研究发现: 使用certbot,L可以通过脚本的形式来完成证书的颁发,通过设置定时任务在过期前重新申请和替换,就可以曲线救国的形式来完成ssl证书自动续期,解放双手。

了解certbot

Certbot 是一个免费、开源的软件工具,用于从 Let’s Encrypt 等证书颁发机构获取和自动更新 SSL/TLS 证书。

Certbot 实现颁发证书的原理

生成密钥对和 CSR(证书签名请求):

  • Certbot 首先在服务器上生成一个密钥对,包括私钥和公钥。私钥将被严格保密,存放在服务器上,用于对数据进行加密和解密。公钥则包含在 CSR 中。
  • CSR 是一个包含服务器信息(如域名、组织名称等)的文件,它是向证书颁发机构申请证书的请求。Certbot 会根据服务器的配置和用户提供的信息生成 CSR。
    验证域名所有权:
    证书颁发机构需要确保申请证书的人拥有该域名的所有权。Certbot 会通过多种方式来验证域名所有权,常见的方法有:
  • HTTP 验证:Certbot 在服务器上放置一个特定的文件,证书颁发机构会通过访问该文件来验证服务器是否对该域名有控制权。
  • DNS 验证:在域名的 DNS 记录中添加特定的 TXT 记录,证书颁发机构通过查询 DNS 记录来验证所有权。

提交 CSR 并获取证书:
一旦域名所有权验证通过,Certbot 会将 CSR 提交给证书颁发机构,如 Let’s Encrypt。
证书颁发机构会对 CSR 进行审核,如果一切符合要求,就会颁发一个数字证书。这个证书包含了服务器的公钥、域名信息、颁发机构的数字签名等。

安装证书:
Certbot 将获取到的证书安装到服务器上的适当位置,通常是与服务器软件(如 Nginx、Apache 等)相关的配置文件目录中。
服务器软件在启动时会读取证书文件,并使用其中的公钥来建立安全的 HTTPS 连接。

自动更新:
Certbot 可以设置为定期自动更新证书,以确保证书在有效期内始终有效。通常,Let’s Encrypt 颁发的证书有效期为 90 天,Certbot 会在证书即将过期之前自动执行更新流程,无需人工干预。

查看nginx的映射情况

确认已经对外映射了容器卷(生成的证书要放在本地目录,便于映射给nginx容器)

docker inspect nginx
在这里插入图片描述

确认开放了80和443端口
在这里插入图片描述

操作目标

在这里插入图片描述
先不着急执行此命令,需要先去nginx的域名下面配置验证文件:
在nginx.conf下配置

在这里插入图片描述
对应关系如下:
宿主机和nginx容器对应文件目录

文件名称文件拥有者
/my/nginx/html宿主机目录位置
/usr/share/nginx/htmlnginx容器

宿主机和certbot容器对应文件目录

文件名称文件拥有者
/my/nginx/html/certbot宿主机目录位置
/data/letsencryptcerbot

执行上面的命令后, 验证文件会放在cerbot 容器的 /data/letsencrypt /.well-known/acme-challenge/,对应着 宿主机的 /my/nginx/html/certbot/.well-known/acme-challenge/ ,也就是对应nginx容器对应的 /usr/share/nginx/html/certbot/.well-known/acme-challenge/
。 通过这对应关系,后面才能执行成功。

  # 处理特定后缀的请求
 location  ~/.well-known/acme-challenge/ {
       root /usr/share/nginx/html/certbot;           
}

执行命令:

 docker run -it --rm --name certbot \
            -v /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt:/etc/letsencrypt \
            -v /my/nginx/ssl/wiseinsightai/certbot/var/lib/letsencrpt:/var/lib/letsencrypt \
            -v /my/nginx/ssl/wiseinsightai/certbot/var/log/letsencrpt:/var/log/letsencrypt \
            -v /my/nginx/html/certbot:/data/letsencrypt \
            certbot/certbot certonly  \
            --webroot  \
            --webroot-path=/data/letsencrypt \
            --agree-tos -d XXX.com

正常情况下,执行成功,会生成证书,在/etc/letsencrypt/live/域名/live下,对应的宿主机目录下:在这里插入图片描述

再根据对nginx容器的容器卷映射,转成nginx的目录:
即: # 对应 /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/域名

配置nginx配置的ssl证书

   server {
        listen 80;
        listen [::]:80;
        server_name www.XXX.com  XXX.com;
        server_tokens off;
       
  
        # 处理特定后缀的请求
        location  ~/.well-known/acme-challenge/ {
            root /usr/share/nginx/html/certbot;           
        }

        # http跳转到https
        location / {
            return 301 https://XXX.com$request_uri;
        }

        # location / {
        #     proxy_pass  http://172.22.251.52:3000;
        # }
    }


    # 处理https请求
    server {
        listen 443 ssl;
        server_name  XXX.com www.XXX.com;

        server_tokens off;

        # 对应 /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/XXX.com目录
        ssl_certificate /etc/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/XXX.com/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/XXX.com/privkey.pem;

        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        # root /usr/share/nginx/html;
        # index index.html;

        location / {
           //  自己的服务或者静态文件html地址
            proxy_pass  http://172.22.251.52:3000;
        }
    }

配置好后,重启nginx容器,ssl证书就正式生效了!!!
在这里插入图片描述

设置自动续签

因为证书3个月就到期,我们可以设置一个定时任务,自动生成即可,cerbot的续签命令是renew关键字,
命令如下:


 docker run -it --rm --name certbot \
            -v /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt:/etc/letsencrypt \
            -v /my/nginx/ssl/wiseinsightai/certbot/var/lib/letsencrpt:/var/lib/letsencrypt \
            -v /my/nginx/ssl/wiseinsightai/certbot/var/log/letsencrpt:/var/log/letsencrypt \
            -v /my/nginx/html/certbot:/data/letsencrypt \
            certbot/certbot  renew

将此命令写成放在脚本里面。
在这里插入图片描述
通过crontab -e设置定时执行该脚本:内容如下:
根据自己的需求设置定时时间,我这里设置12小时一次。

# 自动续签证书
0 */12 * * * /root/renew_cert.sh

注意: 只有到期30天内才能执行成功,否则,脚本会提示没过期,不需要续签,直接跳过

在这里插入图片描述


实战

假定给 web.test.com 配置证书可以如下写

1.配置nginx

# 处理特定后缀的请求
 location  ~/.well-known/acme-challenge/ {
       root /usr/share/nginx/html/certbot-web.test.com;           
}


2. 颁发证书
 docker run -it --rm --name certbot-web-test-com \
            -v /my/nginx/ssl/web.test.com/etc/letsencrypt:/etc/letsencrypt \
            -v /my/nginx/ssl/web.test.com/var/lib/letsencrpt:/var/lib/letsencrypt \
            -v /my/nginx/ssl/web.test.com/var/log/letsencrpt:/var/log/letsencrypt \
            -v /my/nginx/html/certbot-web.test.com:/data/letsencrypt \
            certbot/certbot certonly  \
            --webroot  \
            --webroot-path=/data/letsencrypt \
            --agree-tos -d web.test.com

3.nginx.conf配置ssl证书
ssl_certificate /etc/nginx/ssl/web.test.com/etc/letsencrypt/live/web.test.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/web.test.com/etc/letsencrypt/live/web.test.com/privkey.pem;

4.自动续签
编写续签脚本
/root/cert-scripts/web.test.com/renew_cert.sh
内容如下
 docker run -it --rm --name certbot-web-test-com \
            -v /my/nginx/ssl/web.test.com/etc/letsencrypt:/etc/letsencrypt \
            -v /my/nginx/ssl/web.test.com/var/lib/letsencrpt:/var/lib/letsencrypt \
            -v /my/nginx/ssl/web.test.com/var/log/letsencrpt:/var/log/letsencrypt \
            -v /my/nginx/html/certbot-web.test.com:/data/letsencrypt \
            certbot/certbot  renew

5 定时任务
# 自动续签证书
# 每两周日的周日执行一次( 一周内为完全相同的一组域名(不考虑顺序)申请证书超过 5 次就会触发此速率限制)
# 0 0 * /14 0:第一个 “0” 表示分钟为 0;第二个 “0” 表示小时为 0;“” 表示任意天;“*/14” 表示每 14 天;“0” 表示周日。
0 0 * */14 0  /root/cert-scripts/web.test.com/renew_cert.sh

以上便是,使用docker版的cerbot在 已经安装nginx容器的情况下,获取免费ssl证书和设置自动续签的全部内容,
人无完人,如有错误,欢迎提出交流意见或者指正!!!


大功告成!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怒放de生命2010

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值