2

所以我正在尝试为我的项目添加一个 ssl 证书,在我的本地机器上,我只需按照 keytool 命令添加它,然后它就可以工作了。但是当我尝试在拥有我的 k8s 集群的机器上做同样的事情时,它似乎不起作用。

我看到几个人在他们的 docker 文件中将 cer 添加到 cacerts 但我没有,因为我使用的是谷歌的 Jib,所以我不确定它应该如何从这里开始,或者它是我应该的配置添加到我的 k8s 部署文件?

4

1 回答 1

5

背景

在这里,我假设您部署到 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
于 2020-07-20T15:07:18.717 回答