所以我正在尝试为我的项目添加一个 ssl 证书,在我的本地机器上,我只需按照 keytool 命令添加它,然后它就可以工作了。但是当我尝试在拥有我的 k8s 集群的机器上做同样的事情时,它似乎不起作用。
我看到几个人在他们的 docker 文件中将 cer 添加到 cacerts 但我没有,因为我使用的是谷歌的 Jib,所以我不确定它应该如何从这里开始,或者它是我应该的配置添加到我的 k8s 部署文件?
所以我正在尝试为我的项目添加一个 ssl 证书,在我的本地机器上,我只需按照 keytool 命令添加它,然后它就可以工作了。但是当我尝试在拥有我的 k8s 集群的机器上做同样的事情时,它似乎不起作用。
我看到几个人在他们的 docker 文件中将 cer 添加到 cacerts 但我没有,因为我使用的是谷歌的 Jib,所以我不确定它应该如何从这里开始,或者它是我应该的配置添加到我的 k8s 部署文件?
在这里,我假设您部署到 Kubernetes 的应用程序正在连接到受 Kubernetes 外部服务器证书保护的外部服务器。比如像这篇文章中的案例。
从上面的链接中可以看出,确实有多种方法可以解决这个问题。但是,请注意本文中解释的方法并不真正适用于 Java,因为 Java不使用操作系统中的系统 CA 证书存储,而是使用自己的 truststore:
它使用自己的实现,而不是使用 Windows 证书存储。Java 证书存储在一个名为的文件中,
cacerts
位于C:\Program Files (x86)\Java\jre1.x.x_xxx\lib\security\
因为你说你在本地成功使用了 keytool,我假设你已经知道这个 Java 行为以及你的服务器证书应该被导入到哪里——也就是说,cacerts
在 JRE 目录下的 JRE 的默认文件中(除非你使用一些系统属性来告诉JVM 在不同位置查找 CA 信任库)。既然你说你让它在本地工作,理论上你可以遵循同样的方法,它也应该在 Kubernetes 上工作。
cacerts
在构建时嵌入一种直接的方法是在图像构建时将您的证书烘焙到您的图像中(正如您使用该Dockerfile
方法所暗示的那样)。为此,您可以使用 Jib 的<extraDirectories>
功能将任意文件复制到图像中(用法:Maven / Gradle)。只需准备一个新cacerts
文件并将其放入图像中 JRE 的默认位置即可。
cacerts
在运行时供应如果您不喜欢将证书烘焙到图像中的想法,而是想在运行时提供它,我相信您基本上可以遵循我上面链接的文章中描述的最后一种方法(尽管对于 Java,您应该cacerts
改为,当然)。我不是该领域的 Kubernetes 专家,不确定 Kubrenetes 是否提供了另一种专门的解决方案,但文章中的方法似乎合理并且应该有效。
对于 Kubernetes 以外的容器运行时,它们都有自己的方式在运行时提供文件或附加卷,因此您应该能够实现相同的目标。
UPDATE:在许多 Linux 发行版上,通常<JRE>/lib/security/cacerts
是指向 的符号链接/etc/ssl/certs/java/cacerts
,因此您可以选择更新后者而不是前者。
# ls -l /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
lrwxrwxrwx 1 root root 27 Jan 1 1970 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts -> /etc/ssl/certs/java/cacerts