Docker获取Let`s Encrypt SSL 证书

docker,获取,let,encrypt,ssl,证书 · 浏览次数 : 188

小编点评

**docker 命令步骤:** 1. 安装 Docker:`yum install -y yum-utils device-mapper-persistent-data lvm2` 2. 安装 Docker CE:`docker-ce.repo` 3. 创建 Nginx 配置文件 `default.conf`: * 为静态网站设置 TLS 证书。 * 为 Nginx 启动容器配置 DH 参数。 4. 启动 Nginx 服务:`docker-compose up -d` 5. 申请和更新证书: * 创建 `./certbot/etc/letsencrypt` 文件夹。 * 创建 `fullchain.pem` 和 `privkey.pem` 文件。 * 使用 `docker run` 命令运行 `certbot` 服务,并指定证书目录和证书文件名。 6. 更新 `nginx` 配置文件: * 创建 `./certbot/etc/letsencrypt/archive` 文件夹。 * 将历史证书和 DH 参数文件复制到 `archive` 中。 7. 重新启动 `nginx` 服务:`docker-compose up -d3.2` 8. 设置每月1号00:00更新证书: * 创建 `./site` 文件夹。 * 添加以下脚本到 `site` 文件中: ```bash #!/bin/bash docker run -it --rm \\-v ./certbot/etc/letsencrypt:/etc/letsencrypt \\-v ./certbot/var/lib/letsencrypt:/var/lib/letsencrypt \\-v ./certbot/var/log/letsencrypt:/var/log/letsencrypt \\-v ./site:/data/letsencrypt \\certbot/certbot \\renew --webroot -w /data/letsencrypt --quiet && docker kill --signal=HUP frontendcrontab -e新增一条定时任务,每月1号00:00更新一次证书:0 0 1 * * {{YOURPATH}}/renew.sh ``` * 运行脚本:`chmod +x renew.sh && ./renew.sh` **注意:** * `YOURPATH` 中应该替换您的实际路径。 * 请确保所有文件和目录都有 proper权限。

正文

文中的操作都是在CentOS Stream release 9下执行的,使用的是root用户。

1. 安装docker

# 卸载原有的docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置docker-ce源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 安装docker-compose
wget https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64
chmod +x docker-compose-linux-x86_64 && mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose && ldconfig

2. Let`s Encrypt及Certbot介绍

关于Let`s Encrypt可以参见这里

certbot安装使用参加这里

3. Docker运行Certbot获取证书

为了方便维护、升级,同时也避免破坏本地的开发环境,我这里使用docker方式来运行certbot。整个过程分为两步:首次申请证书和证书更新。

3.1 首次申请证书

因为我的文章都是通过jekyll运行的静态网站,之后会通过nginx来运行,所以这里就以nginx为例来配置网站的tls证书。

  1. 创建nginx配置文件default.conf
server {
    listen      80;
    server_name example.com www.example.com;

    # 高优先级,仅用于更新证书
    location ~ /.well-known/acme-challenge {
        allow all;
        root /data/letsencrypt;
    }
}
  1. docker-compose文件:
version: '3.3'

services:
  nginx:
    image: nginx:1.23.4-alpine
    container_name: frontend
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./frontend:/usr/share/nginx/html
    ports:
      - 80:80
  1. 启动web服务: docker-compse up -d
  2. 启动certbot申请证书:

docker run --rm -it -v ./certbot/etc/letsencrypt:/etc/letsencrypt -v ./certbot/var/log/letsencrpt:/var/log/letsencrypt -v ./frontend:/data/letsencrypt certbot/certbot:latest certonly --webroot --email your@eamil.com --agree-tos --no-eff-email --webroot-path=/data/letsencrypt -d example.com -d example.com

运行结束后可以在./certbot/etc/letsencrypt/live目录下找到example.com文件夹,其中包含证书文件fullchain.pem和私钥文件privkey.pem

  1. 停止web服务:docker-compose down
  2. 更新compose文件:
version: '3.3'

services:
  nginx:
    image: nginx:1.23.4-alpine
    container_name: frontend
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      # - ./frontend:/usr/share/nginx/html
      - ./certbot/etc/letsencrypt/live:/letsencrypt/live        # 当前证书目录
      - ./certbot/etc/letsencrypt/archive:/letsencrypt/archive  # 历史证书目录
      - ./dhparam-2048.pem:/letsencrypt/dhparam-2048.pem        # 使用2048位DH(Diffie-Hellman)参数
    ports:
      - 80:80
      - 443:443

2048为DH参数生成命令:openssl dhparam -out ./dhparam-2048.pem 2048

  1. 更新nginx配置文件
# 处理http请求
server {
    listen      80;
    server_name example.com www.example.com;

    # 重定向到https
    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }

    # 高优先级,仅用于更新证书
    location ~ /.well-known/acme-challenge {
        allow all;
        root /data/letsencrypt;
    }
}

# 处理https请求
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    server_tokens off;

    ssl_certificate /letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /letsencrypt/live/example.com/privkey.pem;

    ssl_buffer_size 8k;

    ssl_dhparam /letsencrypt/dhparam-2048.pem; # 使用2048位DH参数,加强安全

    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    root /usr/share/nginx/html;
    index index.html;
}
  1. 重新启动web服务:docker-compose up -d

3.2 证书更新

  1. 通过以下脚本可以实现证书更新:
#!/bin/bash

docker run -it --rm \
-v ./certbot/etc/letsencrypt:/etc/letsencrypt \
-v ./certbot/var/lib/letsencrypt:/var/lib/letsencrypt \
-v ./certbot/var/log/letsencrypt:/var/log/letsencrypt \
-v ./site:/data/letsencrypt \
certbot/certbot \
renew --webroot -w /data/letsencrypt --quiet && docker kill --signal=HUP frontend
  1. crontab -e新增一条定时任务,每月1号00:00更新一次证书:0 0 1 * * {{YOURPATH}}/renew.sh

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


与Docker获取Let`s Encrypt SSL 证书相似的内容:

Docker获取Let`s Encrypt SSL 证书

文中的操作都是在CentOS Stream release 9下执行的,使用的是root用户。 1. 安装docker # 卸载原有的docker yum remove docker docker-client docker-client-latest docker-common docker-la

linux获取docker容器中的文件路径怎么表示

在Linux系统中,Docker容器中的文件路径与宿主机上的文件系统是隔离的,因此我们不能直接使用宿主机的文件系统路径来访问容器内的文件。但是,有几种方法可以让我们获取或操作Docker容器中的文件。 1.linux获取docker容器中的文件路径的方法 1.1使用docker cp命令 docke

docker.from_env() 获取docker守护进程时出现 TypeError: load_config() got an unexpected keyword argument 'config_dict' 异常

某天使用python重启docker容器时,出现了一个令人费解的BUG,我的代码为 1 def restart_docker(container_name): 2 # 连接到docker守护进程 3 client = docker.from_env() 4 try: 5 # 获取容器对象 6 con

[转帖]k3s containerd和docker 命令对比

https://www.cnblogs.com/already/p/12691327.html k3s默认使用container 两者命令对比表: idcontainerd 命令docker 命令备注 1 ctr image ls docker images 获取image信息 2 ctr imag

Docker 基础 - 1

镜像 获取镜像 docker pull 查看镜像信息 docker images docker inspect # 获取镜像的详细信息 搜寻镜像 docker search 删除镜像 docker rmi 当一个镜像拥有多个标签,docker rmi 只是删除该镜像指定的标签

查看docker容器使用的cpu和内存

转载请注明出处: 使用docker ps命令列出正在运行的Docker容器,并获取目标容器的ID或名称。 使用docker stats <容器ID或名称>命令来实时监测指定容器的资源使用情况。该命令将显示容器的CPU利用率、内存使用量、网络流量等信息。 例如,要查看名为my_container的容器

【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案

问题描述 创建App Service Container服务,选择从Docker Hub中获取appsmith/appsmith-ce 镜像(https://www.appsmith.com/ & https://hub.docker.com/r/appsmith/appsmith-ce/tags

[转帖]kubelet 原理解析六: 垃圾回收

https://segmentfault.com/a/1190000022163856 概述 在k8s中节点会通过docker pull机制获取外部的镜像,那么什么时候清除镜像呢?k8s运行的容器又是什么时候清除呢? api-server: 运行在master,无状态组件,go自动内存垃圾回收 co

[转帖]Docker 安装部署RabbitMQ

https://www.jianshu.com/p/14ffe0f3db94 15691 15692 这两个端口挺有用的 这里注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面。 获查询镜像 docker search rabbitm

[转帖]查看docker中运行的JVM参数问题及解决方法

方法一、jcmd命令: 1、jps获取java的线程id 2、jcmd pidVM.flags获取 51152:-XX:CICompilerCount=3 -XX:InitialHeapSize=526385152 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=