【问题标题】: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
    相关资源
    最近更新 更多