1. 简介

在设备之间建立连接时,常常需要验证身份。SSL 证书是实现这一目标的常见方式。一个证书通常包含签发机构、公钥、过期时间等信息。

如今,Docker 容器等虚拟化技术被广泛用于部署应用。因此,为了确保应用与客户端之间的安全通信,我们也需要将 SSL 证书导入到容器中。

本文将介绍如何将 SSL 证书导入 Docker 容器。 我们会先简要回顾相关概念,然后展示一个导入证书的示例 Dockerfile,并最终在容器中运行并验证整个流程。

2. 导入 SSL 证书的基本步骤

Docker 容器是一个隔离的运行环境,它将应用及其依赖打包在一起,确保环境一致性。我们通过 Dockerfile 来定义构建镜像的步骤。

要实现安全通信,我们需要将 SSL 证书复制到容器中,并配置环境使其能够正确识别这些证书。

以下是一个常见的 Dockerfile 示例:

FROM your_base_image

# 将 SSL 证书复制到容器中
COPY your_certificate.crt /usr/local/share/ca-certificates/

# 更新容器中的证书库
RUN update-ca-certificates

📌 解释:

  • /usr/local/share/ca-certificates/ 是 Linux 系统默认用于存储信任证书的目录。
  • update-ca-certificates 命令会扫描该目录下的证书并更新信任库。
  • 不同应用查找证书的路径可能不同。例如,Java 应用通常会在 $JAVA_HOME/lib/security/cacerts 中查找证书。

⚠️ 注意:务必根据应用的类型,将证书复制到正确的路径,否则证书将不会生效。

3. 示例:将 SSL 证书导入 Nginx 容器

我们以 Nginx 为例,演示如何将 SSL 证书导入容器并验证其存在性。

我们假设已经使用 OpenSSL 生成了一个名为 certificate.crt 的自签名证书。

3.1 编写 Dockerfile

FROM nginx

# 将 SSL 证书复制到容器内
COPY certificate.crt /usr/local/share/ca-certificates/certificate.crt

# 更新证书库
RUN update-ca-certificates

3.2 构建镜像

$ docker build -t example-certificate .

3.3 运行容器并验证证书

$ docker run -d --name cert_container example-certificate
$ docker exec -it cert_container /bin/bash

进入容器后,检查证书是否已正确复制:

$ ls /usr/local/share/ca-certificates | grep certificate.crt
certificate.crt

使用 OpenSSL 查看证书详细信息:

$ openssl x509 -in /usr/local/share/ca-certificates/certificate.crt -text -noout

输出示例(部分):

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            1b:dc:b1:66:c0:14:4a:ee:fe:ec:17:21:03:c3:32:6f:df:17:23:ff
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = BR, ST = stateA, L = cityA, O = companyA, OU = sectionA, CN = domain, emailAddress = admin@example.com
        Validity
            Not Before: Apr 25 17:21:41 2024 GMT
            Not After : Apr 25 17:21:41 2025 GMT
        Subject: C = BR, ST = stateA, L = cityA, O = companyA, OU = sectionA, CN = domain, emailAddress = admin@example.com
        ...

✅ 如果能看到证书信息,则说明导入成功。

4. 小结

本文介绍了如何将 SSL 证书导入 Docker 容器:

  • 使用 COPY 指令将证书文件复制到容器指定目录
  • 使用 update-ca-certificates 命令更新系统信任库
  • 根据应用类型,确保证书路径正确(如 Java 应用需复制到 $JAVA_HOME/lib/security/cacerts

⚠️ 踩坑提醒:

  • 容器每次重建都会丢失数据,证书应通过 Dockerfile 持久化,而不是手动复制
  • 不同 Linux 发行版可能存放证书的路径不同,要根据基础镜像确认路径是否正确
  • Java 应用需额外导入证书到 keystore,不能仅依赖 update-ca-certificates

通过上述步骤,你可以确保容器中的应用能够信任你导入的 SSL 证书,从而建立安全的 HTTPS 连接。


原始标题:Importing SSL Certificates into Docker Container