跨 Docker 容器使用主机 SSL 证书

问题描述 投票:0回答:1

目标

我想确保安装在我的主机上的 SSL 证书可由在该计算机上运行的 Docker 容器使用。

我的设置

VM:我的虚拟机是运行 Linux (Debian 11) 的 Google Cloud Compute Engine 实例。到目前为止,我一直在这个虚拟机上运行我的 web 应用程序(这也是安装 SSL 证书的地方)。

SSL 证书:我已使用 LetsEncrypt 在虚拟机上为我的域安装证书。安装成功,这些文件存储在虚拟机上的 /root/etc/letsencrypt/live 位置。我找不到下载它们的方法,因为它们受密码保护,而且我没有密码(我不知道通过 SSH 连接到我的虚拟机时使用

sudo
使用什么密码)。

Docker: 我正在迁移到 Docker 容器(从我当前的基本“直接在虚拟机上运行”设置)。我正在使用 docker-compose 文件,其中定义了所有服务(一个 web 应用程序和一个后端服务)。 Web 应用程序需要访问 SSL 证书。每个服务的 Dockerfile 都非常基本 - 复制我的本地存储库并具有运行时 CMD ,它处理从 GCP 秘密管理器下载密钥并运行应用程序。我正在成功构建 Docker 映像(在本地运行

docker compose build
)。

Docker 撰写:

version: '3.12'

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    ports:
      - "8000"

应用程序 Dockerfile:

FROM python:3.12.0-bullseye
WORKDIR /home
COPY repo /home/repo
WORKDIR /home/repo
COPY /scripts/startup_script.sh /usr/local/bin
RUN chmod +x /usr/local/bin/startup_script.sh

CMD ["/usr/local/bin/startup_script.sh"]

启动脚本:

#!/bin/bash

#Download secrets
mkdir -p secrets
gcloud secrets versions access "latest" --secret=google_workspace_credentials --out-file=secrets/credentials.json
gcloud secrets versions access "latest" --secret=credentials_webapp --out-file=secrets/credentials_webapp

#Copy over the google workspace credentials
cp "$HOME"/secrets/credentials.json auth/credentials.json
cp "$HOME"/secrets/credentials_webapp auth/credentials_web.json

#Acquire SSL Certificate
...don't know what to do here

#Setup the runtime packages
pip install -r requirements.txt

#Run the programs
python3 app.py

我尝试过/考虑过的

1。将证书复制到我的本地计算机并使用它来构建 docker 映像 这不起作用,因为我需要一个密码来 sudo 从虚拟机复制证书,但我没有 sudo 的密码(我从未设置过密码,虚拟机是由 Google Compute Engine 预先构建的)。所以我被困住了。我还认为将密钥存储在图像本身上可能存在风险。

2。我读到可以在容器本身上运行 certbot 作为设置脚本的一部分,以便每次设置新的 SSL 证书 但这似乎是一个坏主意,因为 1. 如果它不能成功工作,你永远不会知道,2. 你将证书密钥直接添加到图像中,这看起来很粗略,以及 3. LetsEncrypt(和其他 CA 服务有速率)限制)。然而,这个解决方案似乎很方便,因为这意味着我不必处理虚拟机中的密钥,并且可以在任何主机上启动我的容器,而无需关心 SSL 证书。

3.使用 docker run 时将证书文件挂载到 docker 我读过有关此堆栈溢出响应的内容。如果我的解释正确,该方法会在使用

docker run path/to/certs
在虚拟机中运行容器时挂载证书文件。我有点担心这不起作用,因为证书受密码保护。但我还没有尝试过,因为我还不明白这个解决方案及其工作原理。

4。我可能读过有关在容器上打开端口以侦听主机传递证书的方法。 我不知道该怎么做,但这似乎是出于安全目的的理想选择。

问题

我应该采取什么方法以及实现它的步骤是什么(如果可能的话,还有示例代码,因为我是新开发人员)!

ssl docker-compose ssl-certificate gcp-compute-instance
1个回答
0
投票

使用 Traefik 作为您的集群的入口路由器。配置 Traefik 以直接从 LetsEncrypt 获取证书作为其 ssl 卸载设置的一部分。

现在您已经设置了一个容器,无需自己管理证书,并且可以为无数基于 docker 的服务提供 tls 支持。

© www.soinside.com 2019 - 2024. All rights reserved.