Docker + Nginx 完成SSL证书分发

以阿里云为域名供应商为例

步骤 :

1. 给用户添加权限(云解析权限)

2. 拿到阿里云的AccessKey

3. 解析域名到服务器

获取证书

# 拉取镜像
sudo docker pull neilpang/acme.sh:3.0.5

# 创建目录
mkdir ./acme
mkdir ./acme/domains
mkdir ./acme/domains/*.dev.lyjust.top

# 启动容器
sudo docker run --network=host \
  --restart=always -d  \
  -v "$(pwd)/acme":/acme.sh  \
  --name acme neilpang/acme.sh:3.0.5 daemon
  

# 注册  zerossl
sudo docker exec acme --register-account  -m 2645895206@qq.com --server zerossl

# 注意,申请域名证书需要配置相关的参数,请参照 https://github.com/acmesh-official/acme.sh/wiki 指定key和secret此处我使用阿里云

# 申请泛域名证书 *.dev.lyjust.top
sudo docker exec \
 -e Ali_Key= \      // 阿里云key
 -e Ali_Secret= \   // 阿里云secret
 acme --issue --dns dns_ali \
 -d *.dev.lyjust.top \
 --cert-file	    /acme.sh/domains/*.dev.lyjust.top/cert.cert \
 --key-file         /acme.sh/domains/*.dev.lyjust.top/key.key \
 --ca-file          /acme.sh/domains/*.dev.lyjust.top/ca.cer \
 --fullchain-file   /acme.sh/domains/*.dev.lyjust.top/fullchain.pem

注意:
一定不要乱删删acme的文件及文件夹

Nginx配置

自行修改域名,证书存放的位置
以dev.lyjust.conf为例(服务器位置:/docker/yamls/nginx/conf.d/dev.lyjust.conf)

server {
        listen 80;
        server_name *.dev.lyjust.top;

        return 301 https://$host$request_uri;   # 重定向
}


server {
        listen 443 ssl;
        server_name *.dev.lyjust.top;

        underscores_in_headers on;
        ignore_invalid_headers off;

        ssl on;
        ssl_certificate /domains/*.dev.lyjust.top/fullchain.pem;    # SSL 证书文件的存放路径
        ssl_certificate_key /domains/*.dev.lyjust.top/key.key;       # SSL 密钥文件的存放路径
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
 
        location / {
 
	proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header Connection keep-alive;
        proxy_set_header real-ip $remote_addr;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 72000;

        proxy_set_header Connection '';
        proxy_http_version 1.1;
        chunked_transfer_encoding off;

	proxy_buffering off;
        proxy_cache off;

        proxy_pass http://127.0.0.1:7080/; #转发到本机7080端口


      }
}

acme 配置化

配置文件

version: "3.8"

services:
  nginx:
    container_name: nginx
    image: nginx:1.19.6
    restart: always
    network_mode: host
    logging:
      options:
        max-size: "2048m"
        max-file: "10"
    labels:
      - sh.acme.autoload=nginx
    volumes:
      - /docker/yamls/nginx/acme/domains:/domains
      - /docker/yamls/nginx/conf.d:/etc/nginx/conf.d
      - /docker/yamls/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /docker/yamls/nginx/www:/var/www

  acme.sh:
    container_name: acme
    image: neilpang/acme.sh:3.0.5
    restart: always
    command: daemon
    volumes:
      - /docker/yamls/nginx/acme:/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DP_Id=372080
      - DP_Key=999c4545652d365f74eea9bcdca65b54
      - DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload=nginx
      - DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"

这样配置了还需要申请证书:
第一次申请

sudo docker exec \
 acme --issue --dns dns_ali \
 -d *.dev.lyjust.top \
 --cert-file	    /acme.sh/domains/*.dev.lyjust.top/cert.cert \
 --key-file         /acme.sh/domains/*.dev.lyjust.top/key.key \
 --ca-file          /acme.sh/domains/*.dev.lyjust.top/ca.cer \
 --fullchain-file   /acme.sh/domains/*.dev.lyjust.top/fullchain.pem

第二次申请

sudo docker exec \
 acme --issue --dns dns_ali \
 -d *.dev.lyjust.top \
 --cert-file	    /acme.sh/domains/*.dev.lyjust.top/cert.cert \
 --key-file         /acme.sh/domains/*.dev.lyjust.top/key.key \
 --ca-file          /acme.sh/domains/*.dev.lyjust.top/ca.cer \
 --fullchain-file   /acme.sh/domains/*.dev.lyjust.top/fullchain.pem \
 --force

注意:ssl on; 这个指令在较旧版本的 Nginx 中使用,它用于明确指示 Nginx 在特定的 server 块中启用 SSL。

在较新的 Nginx 版本中,您可以直接在 listen 指令中包含 ssl 关键字(如 listen 443 ssl;),因此无需单独使用 ssl on;。使用 listen 443 ssl; 会让 Nginx 自动为该 server 块启用 SSL。

posted @ 2023-06-01 21:59  追梦少年ヽ  阅读(298)  评论(0编辑  收藏  举报