[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
参考
本文来自:[docker]nginx利用certbot4docker 自动续期证书-小码农,转载请保留本条链接,感谢!
- 本文标签: docker nginx certbot
- 本文链接: https://djc8.cn/archives/docker-nginx-uses-certbot4docker-to-renew-certificates-automatically.html
- 版权声明: 本文由小码农原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权