首页 > 解决方案 > Kubernate Pod:如何将证书导入 Java 信任库?

问题描述

所以在我的环境中我使用的是 Docker 和 Kubernetes,现在我必须在 Pods Java Keystore 中导入证书。但是我的容器以NON-ROOT用户身份运行。当我尝试将证书导入 Java Keystore 时,它​​无法访问 Java Keystore 用户只能是 root 用户。

keytool -importcert -alias keycloakTest -keystore $JAVA_HOME/lib/security/cacerts -file $WSO2_SERVER_HOME/keycloak.crt -storepass changeit -noprompt

现在如何将证书导入 Java 信任库?目前我正在手动执行此操作,但后来我必须通过DockerFile

COPY /carFiles/keycloak.crt  $WSO2_SERVER_HOME/
CMD keytool -importcert -alias keycloakTest -keystore $JAVA_HOME/lib/security/cacerts -file $WSO2_SERVER_HOME/keycloak.crt -storepass changeit -noprompt

在 Kubernetes Pods 中,Javaroot仅以用户身份运行?

编辑

我在 Docker File 中进行了类似这样的更改

COPY /carFiles/keycloak.crt /opt
CMD keytool -importcert -alias keycloakTest -keystore $JAVA_HOME/lib/security/cacerts -file /opt/keycloak.crt -storepass changeit -noprompt

所以从 Pods Shell 我可以看到证书复制到/opt目录但下一个CMD命令将无法将证书添加到 java 的信任库中

在此处输入图像描述

输入键,否则您将在 101 分钟后随时退出。

spec:
      volumes:
        - name: certs
          emptyDir: {}
      initContainers:
        - name: {{ .Chart.Name }}-create-keystore-truststore
          securityContext:
            runAsNonRoot: true
            runAsUser: 100
          image: >-
            <HOST>/foapi-tools:20.0.1

 command:
            - sh
            - '-c'
            - >
             # Import Keycloak server certificate into truststore

              # Extract host name from ckey URL

              KEYCLOAK_HOST=$(echo
              "https://<HOST>/auth" | sed
              's|[^/]*//\([^/]*\)/.*|\1|')

              echo "Importing server cert of '${KEYCLOAK_HOST}'..."

              openssl s_client -connect ${KEYCLOAK_HOST}:443 2>/dev/null
              </dev/null | openssl x509 > keycloak.crt

              ls -lat /certs/truststore;
          workingDir: /certs/truststore
          resources:
            limits:
              cpu: 200m
              memory: 200Mi
            requests:
              cpu: 200m
              memory: 100Mi
          volumeMounts:
            - name: certs
              mountPath: /certs/truststore
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent

标签: javadockersecuritykubernetes

解决方案


根据共享信息,您正在使用 WSO2 MI 并尝试使用 Keycloak 从中介序列生成令牌。在这种情况下,不需要将 Keycloak 的证书添加到cacertsJDK 的证书中。您可以使用 WSO2 MIclient-truststore.jks来导入证书。

要访问该/opt路径,用户需要 root 权限。由于 WSO2 MI 本身包含一个信任库,并且不需要任何 root 权限来导入证书,因此您可以简单地在其中导入 Keycloak 的 TLS 公共证书。Dockerfile给定的是导入证书的示例

COPY /carFiles/keycloak.crt $WSO2_SERVER_HOME/repository/resources/security/
RUN keytool -importcert -alias keycloakTest -keystore $WSO2_SERVER_HOME/repository/resources/security/client-truststore.jks -file $WSO2_SERVER_HOME/repository/resources/security/keycloak.crt -storepass changeit -noprompt

注意:将 替换为CMD命令RUN,因为您正在尝试将证书导入到信任库作为构建映像的一部分。并且不将该命令设置为启动容器的入口点。

此外,如果您有一个验证者链,则必须在信任库中包含所有(根证书、中间证书和叶证书)。仅导入其中一个将再次导致 SSL 握手错误。


推荐阅读