我有一个Helm Chart,在部署时会创建以下Kubernetes资源:
1.启用SSL的服务
1.用我的Docker映像创建的容器,它在内部运行与上述服务通信的Java进程。
- 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就不能访问根证书。
实现这一目标的正确途径是什么?
2条答案
按热度按时间ukdjmx9f1#
最简单的方法可能是允许使用sudo运行
keytool
命令。您可能需要在Dockerfile中安装sudo,然后设置
/etc/sudoers
以允许运行entrypoint.sh
的用户运行该特定命令(无需密码)。然后,您需要做的就是找到证书并运行
单位:
entrypoint.sh
或者,您可以在构建容器时安装一个脚本来设置证书并安装它,然后允许 that 与sudo一起运行。这样,如果有人获得容器的访问权限,您就不会添加更多证书
ccrfmcuu2#
靶区; DR
可以将证书添加到
initContainer
中的密钥库。可以使用volume
在initContainer
和container
之间共享密钥库。在此示例中,我们将
tls-secret
作为Kubernetes Secret装载到Pod。tls-secret
包含需要添加到密钥库的tls.crt
。在将安全文件复制到volume
(已装载到Pod的container
)后,我们将证书添加到initContainer
中的密钥库。