原创

[docker]nginx利用certbot4docker 自动续期证书

使用certbot可以简单的申请证书,并且能够通过简单的任务配置,达到自动续期的目的。我现在的站点就是用的let's Encrypt的证书,每3个月需要续期一次,比较繁琐。所以,就想到用certbot来做续期,但是又不想在机器中装太多依赖,一来比较冗余,毕竟3个月才跑一次,二来也是担心工具装的太多,以后迁移系统比较麻烦。

接下来就直接开始吧。我的服务器软件使用的是nginx4docker.

nginx配置

nginx跟宿主机之间做了文件挂载的操作,将nginx的/etc/nginx/路径整个挂载了出来,所以这里就以/etc/nginx/cert,作为证书存放路径来讲解. 我假设宿主机的路径为:/djc8/nginx/cert,该路径对应nginx容器中的/etc/nginx/cert。 另外还挂载了web页面,宿主机:/djc8/www,该路径对应的nginx容器中的/www

如下表格: | 宿主机 | nginx容器 | | ---- | ---- | | /djc8/nginx/cert | /etc/nginx/cert | | /djc8/www | /www |

然后是nginx中的配置文件,我是使用vhost虚拟主机的方式增加的站点,所以在对应的conf中配置内容如下: 首先是443端口的服务中,增加.well-known的权限

location ~ /.well-known {
         allow all;
}

修改证书路径(或者增加,如果是新增的站点的话)

ssl_certificate      cert/fullchain.pem;
ssl_certificate_key  cert/privkey.pem;

然后现在vhost的配置大概如下:

server {
        listen       443;
        root /www/web/djc8_cn/public_html;
        ssl                  on;
        ssl_certificate      cert/djc8.cn/fullchain.pem;
        ssl_certificate_key  cert/djc8.cn/privkey.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_timeout 10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        server_name djc8.cn www.djc8.cn;
        index  index.html index.php index.htm;
        error_page  400 /errpage/400.html;
        error_page  403 /errpage/403.html;
        error_page  404 /errpage/404.html;
        error_page  500 /errpage/500.html;
        error_page  503 /errpage/503.html;
        location ~ \.php(.*)$ {
                fastcgi_pass  djc8php:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
                fastcgi_param PATH_INFO $2;
                include fastcgi_params;
        }
        location ~ /\.ht {
	            deny  all;
	}
        location / {
                 try_files $uri $uri/ /?$args;
        }
        location ~ /.well-known {
                 allow all;
        }
}

Certbot4docker

接下来是下载Certbot:sudo docker pull certbot/certbot

接下来是配置目录: 我这里再列下certbot跟宿主机挂在目录的对应关系 | 宿主机 | certbot| 说明 | | --- | ---| --- | | /djc8/cert/letsencrypt/etc/letsencrypt | /etc/letsencrypt |证书,其他文件路径| | /djc8/cert/letsencrypt/lib/letsencrypt | /var/lib/letsencrypt | 临时文件 | | /djc8/www/web/djc8_cn/public_html | /www |站点路径,该站点路径,需要自行在conf中配置| | /djc8/cert/letsencrypt/var/log | /var/log | 操作过程中的日志文件,可以帮助定位问题 | 对应关系捋顺了,接下来直接docker run就行了。

-- -v "/djc8/nginx/conf/cert:/etc/letsencrypt/live/" \

sudo docker run -it --rm --name certbot \
             -v "/djc8/cert/letsencrypt/etc/letsencrypt:/etc/letsencrypt" \
             -v "/djc8/cert/letsencrypt/lib/letsencrypt:/var/lib/letsencrypt" \
             -v "/djc8/www/web/djc8_cn/public_html:/www" \
             -v "/djc8/cert/letsencrypt/var/log:/var/log" \
            certbot/certbot certonly --webroot -w /www -d djc8.cn -d www.djc8.cn

#成功之后,需要拷贝对应的证书到指定的目录,并且重启nginx
cp -r /djc8/cert/letsencrypt/etc/letsencrypt/archive/djc8.cn /djc8/nginx/conf/cert/
docker restart djc8nginx

自动续期

续期前,先看下限制条件:

使用限制

申请的证书有效期只有90天
同一个顶级域名下的二级域名,一周做多申请 20 个
一个域名一周最多申请 5 次
1 小时最多允许失败 5 次
请求频率需要小于 20 次/s
一个 ip 3 小时内最多创建 10 个账户
一个账户最多同时存在 300 个 pending 的审核

新建sh脚本,放到/djc8/autojob目录下,并且授予可执行权限

echo '' > /djc8/autojob/renewcer.sh
chmod +x /djc8/autojob/renewcer.sh
vi /djc8/autojob/renewcer.sh

内容如下

#!/bin/bash
sudo docker run -it --rm --name certbot \
             -v "/djc8/cert/letsencrypt/etc/letsencrypt:/etc/letsencrypt" \
             -v "/djc8/cert/letsencrypt/lib/letsencrypt:/var/lib/letsencrypt" \
             -v "/djc8/www/web/djc8_cn/public_html:/www" \
             -v "/djc8/cert/letsencrypt/var/log:/var/log" \
            certbot/certbot certonly --webroot -w /www -d djc8.cn -d www.djc8.cn
cp -r /djc8/cert/letsencrypt/etc/letsencrypt/archive/djc8.cn /djc8/nginx/conf/cert/
docker restart djc8nginx

renewcer.sh加入自动任务列表,设置为每2个月执行一次

crontab -e

因为是vim编辑器,使用i进入编辑模式,编辑结束后使用Esc退出编辑模式,并且输入wq写入并保存。 增加一行

* * * */2 * /djc8/autojob/renewcer.sh 

查看自动任务列表

crontab -l

参考

  1. certbot官方
  2. certbot生成并使用Let's Encrypt免费SSL证书(webroot方式)
温馨提示:
本文最后更新于 2021年01月07日,已超过 760 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
正文到此结束
该篇文章的评论功能已被站长关闭
本文目录