将 SSL 证书加载到容器的 JVM

Nee*_*esh 4 java ssl docker kubernetes

我有一个头盔图表。部署时会创建以下 Kubernetes 资源:

  1. 支持 SSL 的服务
  2. 使用我的 Docker 映像创建的容器,该容器在内部运行与上述服务通信的 Java 进程。
  3. Kubernetes Secrets(SSL 证书和访问密钥),安装在上述容器内。

问题是我的容器无法与我的服务通信,除非我将 SSL 证书添加到 Java 证书中。我通过使用root用户在 docker 中手动运行以下命令来完成此操作。

cd ${JAVA_HOME}/jre/lib/security 

keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias myservicecert -file /home/myuser/.myservice/certs/public.crt
Run Code Online (Sandbox Code Playgroud)

我想自动化上述步骤,但面临问题:

  • 我无法在 内执行上述步骤,Dockerfile因为当时证书不可用。显而易见。
  • 我无法在entrypoint.shdocker 文件中添加这些步骤,因为入口点文件是由与 root 不同的用户执行的。
  • 我能想到的另一个解决方案是更改路径的权限${JAVA_HOME}/jre/lib/security/cacerts777以便我可以entrypoint.sh毫无问题地运行这些命令。但出于安全原因,我不确定这是否是正确的方法。对此有何建议?
  • 我不想为使用的证书设置自定义位置,Djavax.net.ssl.trustStore因为这样 java 将无法访问根证书。

实现这一目标的正确方法是什么?

mas*_*eyb 5

长话短说

您可以将证书添加到initContainer. initContainer密钥库可以在和container使用之间共享volume


在此示例中,我们将其作为 Kubernetes Secrettls-secret安装到 pod 中。包含需要添加到密钥库的内容。将安全文件复制到挂载到 pod 的.tls-secrettls.crtinitContainervolumecontainer

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: openjdk:8-jdk-slim-buster
    command:
    - bash
    - -c
    - |
      keytool -list -keystore /usr/local/openjdk-8/jre/lib/security/cacerts -alias local
      sleep infinity
    volumeMounts:
    - mountPath: /usr/local/openjdk-8/jre/lib/security
      name: cacerts
  initContainers:
  - name: init-cacerts
    image: openjdk:8-jdk-slim-buster
    command:
    - bash
    - -c
    - |
      cp -R /usr/local/openjdk-8/jre/lib/security/* /cacerts/
      keytool -import -noprompt -trustcacerts -alias local -file /security/tls.crt -keystore /cacerts/cacerts -storepass changeit
      keytool -list -keystore /cacerts/cacerts -alias local
    volumeMounts:
    - mountPath: /cacerts
      name: cacerts
    - mountPath: /security
      name: tls
  volumes:
  - name: cacerts
    emptyDir: {}
  - name: tls
    secret:
      secretName: tls-secret
      defaultMode: 0400
Run Code Online (Sandbox Code Playgroud)

共享密钥库