Docker环境下使用certbot申请证书
2021-04-01
1,449 views
3 min read
如果你的网站还没有https,那么使用certbot
是一个不错的选择,它能帮你免费申请到90天的https证书,并且可以无限次的续期。
这款工具迭代到今天已经非常的易用,如果你的服务器安装配置好了Nginx
或Apache
,certbot
会自动识别到配置文件并用傻瓜式的操作引导你完成配置,但如果你的服务器程序是在docker里就比较麻烦了。
如果Nginx
是docker部署,那么certbot
无法识别到配置文件,如果应用程序是docker部署,则会更加麻烦,certbot
需要在网站应用的根目录下放置一个文件,用以验证域名,所以你需要把应用程序的根目录挂载出来,对于一些特殊的应用框架可能还要更改一些静态文件路由配置等。
一个比较好的方法就是做一个专门用来申请证书的Nginx
容器,将webroot
文件夹挂载出来。
version: "3.0"
services:
nginx-certbot:
container_name: nginx-certbot
image: nginx:latest
network_mode: host
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./webroot:/var/webroot
以我的配置文件为例,只需让外网能访问到验证文件即可。
server {
listen 80;
server_name sakuradon.com blog.sakuradon.com;
location ~ /.well-known/acme-challenge {
allow all;
root /var/webroot;
}
root /var/webroot;
index index.html;
}
certbot会用到三个路径work-dir
config-dir
logs-dir
,如果不想用到root权限可以指定路径,最后证书会生成在config-dir
下。
certbot certonly --work-dir ./work --config-dir ./letsencrypt --logs-dir ./logs --webroot --webroot-path ./webroot --agree-tos -d ${domain}
证书生成后使用certbot renew
命令可以续期,可以写在系统定时任务中。
certbot renew --work-dir ./work --config-dir ./letsencrypt --logs-dir ./logs
最后是Nginx
的配置文件,加上ssl_certificate
和ssl_certificate_key
两项配置即可。
server {
listen 443 ssl;
server_name blog.sakuradon.com;
......
ssl_certificate /etc/letsencrypt/live/blog.sakuradon.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.sakuradon.com/privkey.pem;
}
server {
listen 80;
server_name blog.sakuradon.com;
if ($host = blog.sakuradon.com) {
return 301 https://$host$request_uri;
}
return 404;
}
Previous Post
项目使用Docker多阶段构建
Next Post
React mobx无法触发重新渲染