【发布时间】:2021-08-28 16:37:24
【问题描述】:
所以在我的环境中,我使用的是 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 中,Java 仅作为 root 用户运行?
编辑
我在 Docker 文件中进行了类似的更改
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
【问题讨论】:
-
据我了解,您在容器初始化期间获得了 Keycloak 的公共证书,并试图将其添加到 Java 的
cacerts。如果要访问/opt路径,执行Keytool命令的用户需要sudo权限。 -
但是在 WSO2 中会有一个用户,但不是 root 用户。
-
我可以知道,您使用的是哪个 WSO2 产品,以及为什么您尝试将 Keycloak 证书导入
cacerts(没有合作的 WSO2 密钥库)? -
我正在使用
/wso2/wso2mi:4.0.0,所以我们的产品建立在 WSO2 之上,所以我们将在下载 WSO2 图像后更新一些 jar 和 car 文件,然后重新创建图像。现在从这个修改后的产品中我们调用 SOAP当我们运行我们的 API 时,API 将获取 keycloak 令牌。
标签: java docker security kubernetes