java - 使用 Google Jib 和 Kubernetes 时添加 SSL 证书

标签 java kubernetes dockerfile ssl-certificate jib

所以我正在尝试为我的项目添加一个 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 at C:\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/

相关文章:

java - 在 App Engine 中存储大文本

kubernetes - 在具有不同端口的多个服务中使用单个静态 IP 地址作为 LoadBalancerIP

docker - docker :构建镜像后没有此类文件或目录

docker - 如何修复 Docker 镜像中的严重漏洞?

java - 为什么HashMap执行多次后会返回null和字符串值?

Java Web 服务证书检查

kubernetes - GKE NEG Readiness Gate 因 Windows 容器和 Readiness Probe 而失败

Docker File-跳过项目。因为找不到

java - 如何解决 "java.lang.InstantiationException"?

amazon-web-services - 没有事件的广告连播