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。

                
            
        
浙公网安备 33010602011771号