docker使用certbot与acme生成SSL证书

本文将介绍两种好用的自动化生成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等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值