本文将介绍两种好用的自动化生成SSL证书的方式(certbot、acme)
一、certbot
步骤1:先做好域名dns解析到服务器ip上
步骤2:nginx必须添加的配置
server {
listen 80;
server_name xxxxx;#此处改为自己的域名
#配置http验证可访问
location /.well-known/acme-challenge/ {
#此目录都是nginx容器内的目录,对应宿主机volumes中的http验证目录,而宿主机的又与certbot容器中命令--webroot-path指定目录一致,从而就整个串起来了,解决了http验证问题
root /etc/nginx/cert/certbot/www/;
}
}
步骤3:启动nginx以及certbot,docker-compose.yml代码如下:
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/cert:/etc/nginx/cert
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
- ./nginx/html:/etc/nginx/html
networks:
- basic_net
certbot:
container_name: certbot
image: certbot/certbot
volumes:
- ./nginx/cert/certbot/www:/usr/share/certbot/www #http验证目录,可设置rw可写,与nginx容器对应的宿主机目录时一致的
- ./nginx/cert/certbot/ssl:/etc/letsencrypt #证书位置,同上,注意不要只映射到live,而是它的上一级
networks:
basic_net:
driver: bridge
certbot必须要和nginx搭配,因为在申请证书前会进行域名验证,就需要在你的站点下放一个/.well-known/acme-challenge,这种方式就是官网的Webroot的方式。
步骤4:证书申请
命令如下:
docker compose -f docker-compose-app.yml run --rm certbot certonly --webroot --webroot-path /usr/share/certbot/www/ -d xxx.com
其中:xxx.com替换成你的域名。第一次运行会提示你填写邮箱地址,随便填。
执行完之后,将会在./nginx/cert/certbot/ssl目录下看到五个文件夹:accounts、archive、live、renewal、renewal-hooks,我们nginx需要用到的是live目录下的文件。主要关注以下两个:|
1、live/xxx.com/fullchain.pem对应着nginx的ssl_certificate配置
2、live/xxx.com/privkey.pem对应着nginx的ssl_certificate_key配置
以上是申请证书的全部过程。
证书有效期为三个月,如何自动续签?
步骤1、新建一个certbot-crontab.sh
#!/bin/bash
echo "certbot检查:start"
docker compose -f docker-compose-app.yml run --rm certbot renew
echo "certbot检查:end"
sleep 10
echo "重新加载nginx:start"
docker exec nginx nginx -s reload
echo "重新加载nginx:end"
步骤2:增加certbot-crontab.sh的权限为可执行
步骤3:使用linux的crontab,指令如下:
crontab -e
将以下内容复制上去,其中certbot-crontab.sh、crontab-log.txt的路径替换成你自己的
0 0 1,15 * * /home/docker/workspace/basic/certbot/certbot-crontab.sh > /home/docker/workspace/basic/certbot/log/crontab-log.txt 2>&1 &
二、acme
步骤1、需要在云服务厂商获取到key和secret(此处以阿里云厂商为例)
步骤2:docker-compose.yml代码如下
version: '3'
services:
acme:
image: neilpang/acme.sh:latest
container_name: acme
restart: always
command: daemon
volumes:
- ./nginx/cert/acme:/acme.sh
environment:
- Ali_Key=xxx #此处替换成自己的key,阿里云的是Ali_Key,其他云的请查看官方文档
- Ali_Secret=xxx #此处替换成自己的secret,阿里云的是Ali_Secret,其他云的请查看官方文档
networks:
- basic_net
networks:
basic_net:
driver: bridge
步骤3:证书申请
命令如下:
docker exec acme --register-account -m xxx@qq.com --issue --dns dns_ali -d xxx.com --force --dnssleep
其中:xxx.com替换成你的域名。
执行完之后,将会在./nginx/cert/acme目录下看到xxx.com开头的目录,里面就是我们这次申请的证书。主要关注以下两个:|
1、fullchain.cer对应着nginx的ssl_certificate配置
2、xxx.com.key对应着nginx的ssl_certificate_key配置
以上是申请证书的全部过程。
证书有效期为三个月,如何自动续签?
步骤1、新建一个certbot-crontab.sh
#!/bin/bash
echo "acme检查:start"
docker exec acme --cron
echo "acme检查:end"
sleep 5
echo "重新加载nginx:start"
docker exec nginx nginx -s reload
echo "重新加载nginx:end"
步骤2:增加certbot-crontab.sh的权限为可执行
步骤3:使用linux的crontab,指令如下:
crontab -e
将以下内容复制上去,其中certbot-crontab.sh、crontab-log.txt的路径替换成你自己的
0 0 1,15 * * /home/docker/workspace/basic/certbot/certbot-crontab.sh > /home/docker/workspace/basic/certbot/log/crontab-log.txt 2>&1 &
总结:certbot与acme各有所长。
certbot不需要云厂商的key和secret,比较方便,但是需要校验域名,生成的证书有权限问题,可能某些容器(如:registry)就因为文件权限问题没办法读取到文件。
而acme生成的文件,目前没遇到过其他容器读取的权限问题,但是它需要云厂商的key和secret,目前也就支持一些大厂,例如:腾讯云、阿里云、AWS等。