kubernetes 将SSL证书加载到容器的JVM

igsr9ssn  于 2023-02-07  发布在  Kubernetes
关注(0)|答案(2)|浏览(263)

我有一个Helm Chart,在部署时会创建以下Kubernetes资源:
1.启用SSL的服务
1.用我的Docker映像创建的容器,它在内部运行与上述服务通信的Java进程。

  1. 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

我想自动执行上述步骤,但面临以下问题:

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

实现这一目标的正确途径是什么?

ukdjmx9f

ukdjmx9f1#

最简单的方法可能是允许使用sudo运行keytool命令。
您可能需要在Dockerfile中安装sudo,然后设置/etc/sudoers以允许运行entrypoint.sh的用户运行该特定命令(无需密码)。
然后,您需要做的就是找到证书并运行

sudo keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias myservicecert -file /home/myuser/.myservice/certs/public.crt

单位:entrypoint.sh
或者,您可以在构建容器时安装一个脚本来设置证书并安装它,然后允许 that 与sudo一起运行。这样,如果有人获得容器的访问权限,您就不会添加更多证书

ccrfmcuu

ccrfmcuu2#

靶区; DR

可以将证书添加到initContainer中的密钥库。可以使用volumeinitContainercontainer之间共享密钥库。
在此示例中,我们将tls-secret作为Kubernetes Secret装载到Pod。tls-secret包含需要添加到密钥库的tls.crt。在将安全文件复制到volume(已装载到Pod的container)后,我们将证书添加到initContainer中的密钥库。

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

相关问题