【问题标题】:Adding SSL certificate when using Google Jib and Kubernetes使用 Google Jib 和 Kubernetes 时添加 SSL 证书
【发布时间】:2021-07-09 21:48:54
【问题描述】:

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

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

【问题讨论】:

    标签: java kubernetes dockerfile ssl-certificate jib


    【解决方案1】:
    推荐的答案 Google Cloud

    背景

    在这里,我假设您部署到 Kubernetes 的应用程序正在连接到受 Kubernetes 外部服务器证书保护的外部服务器。比如this article中的情况。

    从上面的链接中可以看出,确实有多种方法可以解决此问题。但是,请注意,文章中解释的方法并不真正适用于 Java,因为 Java doesn't make use of the system CA cert store from the OS but uses its own truststore:

    它使用自己的实现,而不是使用 Windows 证书存储。 Java 证书存储在一个名为 cacerts 的文件中,该文件位于 C:\Program Files (x86)\Java\jre1.x.x_xxx\lib\security\

    因为你说你在本地成功使用了 keytool,我假设你已经知道这个 Java 行为以及你的服务器证书应该被导入到哪里——也就是说,在 JRE 目录下的 JRE 的默认 cacerts 文件中(除非你使用一些系统属性来告诉 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 的符号链接,因此您可以选择更新后者而不是前者。

    # 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
    

    【讨论】:

    • 感谢您的回答,是的,正如您所说的关于 cacerts 解决方案(我确实知道您提到的事情),我正在尝试在文章中应用该解决方案,但真的很高兴 Jib 有这样一个解决方案!
    猜你喜欢
    • 2020-09-05
    • 2021-07-29
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多