java - 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
解决方案
根据共享信息,您正在使用 WSO2 MI 并尝试使用 Keycloak 从中介序列生成令牌。在这种情况下,不需要将 Keycloak 的证书添加到cacerts
JDK 的证书中。您可以使用 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 握手错误。
推荐阅读
- java - 如何通过编译java文件来修复错误
- jdbc - jdbc.connection.getmetadata() 如何更新
- windows-10 - 使用 Intune 加入 Azure AD 时计算机独有的本地管理员
- ruby-on-rails - Rails API:Netflix fast_jsonapi 和 Rails 渲染 - 双数据
- linux - 为什么'wget --page-requisites'非常慢
- vue.js - Vue3 自动前缀配置问题
- python - 如何在条件下通过另一个脚本杀死一个python脚本
- swift - 设计模式问题:当扩展和协议失败时
- node.js - Selenium 不会在无头模式下启动 chrome,无论我做什么
- erlang - 如何从 erlang 中的元组列表中访问一个值并从中创建一个新列表?