在容器中使用私有证书颁发机构和镜像

48次阅读
没有评论

问题描述

面临一个问题:他们拥有一个内部域名,比如 “mycompany.net”,以及一个私有证书颁发机构(CA),用于为该域名下的所有内部应用提供 HTTPS 证书,例如 “myapp.mycompany.net”。现在,他正在开发一个应用程序,需要连接到一个内部的 HTTPS 服务。这个应用程序运行在一个容器内,但默认情况下并不知道私有 CA,导致拒绝连接到 HTTPS 服务。用户考虑了一些解决方案,但不确定哪种方法最合适。

解决方案

在解决这个问题之前,需要注意一些操作可能因版本差异而略有不同。以下是几种解决方案,供你选择:

方案1:将 CA 证书嵌入应用镜像

一种方法是将私有 CA 证书嵌入到每个应用的镜像中。这样,每个应用都可以自行验证连接。这种方法不够干净,需要为每个应用镜像重复添加证书,而且可能会导致错误。

方案2:创建基础镜像

你可以创建一个基础镜像,将私有 CA 证书添加到该镜像中。然后,所有应用都可以使用这个基础镜像。然而,你可能会面临以下两种选择:

选择1:为每种语言创建基础镜像

你可以为每种使用的编程语言(如 Java、Python)创建一个基础镜像,这些镜像都以第一个基础镜像为依赖。这样可以确保所有镜像都包含相同的证书内容,从安全角度来看是一个好处。但这也意味着你需要为每种语言维护一个基础镜像,这可能会产生一些冗余。

选择2:在标准语言基础镜像上添加证书

另一个选择是在标准的语言基础镜像上添加私有 CA 证书。这样做更加简单,但可能会导致每个应用都包含相同的证书,增加了一些维护成本。

方案3:使用环境变量(针对 Python)

针对 Python 应用,你可能还需要设置一个特定的环境变量来使用 CA 证书。具体来说,你需要设置 REQUESTS_CA_BUNDLE 环境变量,将其指向包含你的私有 CA 证书的文件路径。这样,Python 将能够正确地验证 HTTPS 连接。

在 Docker 中,你可以通过以下步骤来实现:

  1. 创建一个 Dockerfile,基于你的应用语言的标准镜像。
  2. 将私有 CA 证书复制到容器中,可以在 Dockerfile 中使用 COPY 命令。
  3. 如果是 Python 应用,设置 REQUESTS_CA_BUNDLE 环境变量,指向证书文件的路径。

以下是一个示例 Dockerfile(假设你的应用是 Python 应用):

# 使用 Python 官方镜像作为基础镜像
FROM python:3.8

# 将私有 CA 证书复制到容器中
COPY my_private_ca.crt /usr/local/share/ca-certificates/

# 更新证书列表
RUN update-ca-certificates

# 设置 REQUESTS_CA_BUNDLE 环境变量
ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

# 复制应用代码到容器中
COPY app.py /app/

# 指定容器启动命令
CMD ["python", "/app/app.py"]

请根据你的实际需求调整以上示例。总之,你可以根据应用的需求,选择将私有 CA 证书嵌入到镜像中,或者创建基础镜像,或者在标准语言基础镜像上添加证书。同时,针对 Python 应用,不要忘记设置 REQUESTS_CA_BUNDLE 环境变量,以确保正确验证 HTTPS 连接。

正文完