所以我正在尝试为我的项目添加一个 ssl 证书,在我的本地机器上,我可以通过简单地按照 keytool 命令添加它,然后它就可以工作了。但是当我尝试在有我的 k8s 集群的机器上做同样的事情时,它似乎没有任何工作。
我看到几个人在他们的 docker 文件中将 cer 添加到 cacerts,但我没有,因为我使用的是 google 的 Jib,所以我不确定它应该如何从这里开始,或者它是我应该将配置添加到我的 k8s 部署文件中吗?
最佳答案
背景
在这里,我假设您部署到 Kubernetes 的应用程序正在连接到受 Kubernetes 外部服务器证书保护的外部服务器。例如,像 this article 中的情况。 .
从上面的链接中可以看出,确实有多种方法可以解决此问题。但是,请注意文章中解释的方法并不真正适用于 Java,因为 Java doesn't make use of the system CA cert store from the OS but uses its own truststore :
Instead of using the windows certificate store it uses its own implementation. Java certificates are stored in a file called
cacerts
located atC:\Program Files (x86)\Java\jre1.x.x_xxx\lib\security\
因为你说你在本地成功使用了 keytool,我假设你已经知道这个 Java 行为以及你的服务器证书应该被导入到哪里——即 JRE 的默认 cacerts
。 JRE 目录下的文件(除非您使用某些系统属性告诉 JVM 在不同位置查找 CA 信任库)。既然你说你让它在本地工作,理论上你可以照着做,它也应该在 Kubernetes 上工作。
嵌入 cacerts
在构建时
一种直接的方法是在镜像构建时将您的证书烘焙到镜像中(正如您使用 Dockerfile
方法所暗示的那样)。为此,您可以使用 Jib 的 <extraDirectories>
将任意文件复制到图像中的功能(用法:Maven/Gradle)。只需准备一个新的cacerts
文件并将其放入图像中 JRE 的默认位置。
供应cacerts
在运行时
如果您不喜欢将证书烘焙到镜像中,而是想在运行时提供它,我相信您基本上可以按照我上面链接的文章中描述的最后一种方法(尽管对于 Java,您应该当然,用 cacerts
代替)。我不是该领域的 Kubernetes 专家,不确定 Kubrenetes 是否提供了另一种专门的解决方案,但文章中的方法似乎合理并且应该可以工作。
对于 Kubernetes 以外的容器运行时,它们都将有自己的方式在运行时提供文件或附加卷,因此您应该能够实现相同的目标。
更新:在许多 Linux 发行版上,通常是 <JRE>/lib/security/cacerts
是 /etc/ssl/certs/java/cacerts
的符号链接(symbolic link),因此您可以选择更新后者而不是前者。
# 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
关于java - 使用 Google Jib 和 Kubernetes 时添加 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62991314/