将安全证书装载到 Google Cloud Kubernetes Engine 中,以便 Java 应用程序可以找到有效的证书路径

Mount Security Certificate into Google Cloud Kubernetes Engine so Java Apps can find valid cert path

我正在使用 Google 的 Kubernetes Engine 来部署一些 Spring 引导应用程序。我已经使用 HTTPS 设置了入口,效果很好,但是当其中一个应用程序试图访问我在 HTTPS 上的授权服务器时,Java 给我以下错误:

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.ssl.Alert.createSSLException

我知道如何在本地修复此问题,但我该如何修复此问题以便部署在 GKE 上的 Java 应用能够找到有效的 .cer 文件?

我尝试将 .cer 文件直接包含在我的 Docker 文件中的 Docker 图像上,但如果我的证书过期并且无法正常工作,这就不太直观了.

我目前已将 crt 文件和密钥文件作为秘密挂载,并且入口正在使用它。以前,我使用的是 Google Cloud 的自我管理证书,效果也很好,但我想使用 Kubernetes 机密进行测试。 `

我认为最好的选择是将 .cer 安装到我的集群上,并通过环境变量指向部署以使用它。这样我就可以在它们过期时轻松更新,而不必重新部署每个图像。

更新:

我将 keystore.jks 作为秘密卷安装到我的 deployment.yaml 上,并配置 Spring 启动以查看该路径,但没有用。

Spring 引导属性

server.ssl.key-store: /mnt/secret/keystore.jks
# other configuration removed for SSL

要在GCP 的 GKE 中解决这个问题,有时替换 cacerts 文件有助于解决它,但按照以下步骤是正确的方法:

a) 使用服务帐户。为了更多地了解 GCP 的服务帐户,请查看此 Official Documentation

b) 在创建集群时将 storage-rw 范围添加到集群的范围。如 documentation 所示,您可以使用以下命令来完成:

gcloud container clusters create example-cluster --scopes=bigquery,storage-rw,compute-ro

使用此 GCP GKE’s official documentation 获取有关 GCP 的 IAM 访问范围 的更多参考。

c) 详细查看您如何创建 Kubernetes Secret。如需更多指导,请使用此 Official GKE’s Secrets Documentation.

此外,您也可以将这些线程用作参考, How to Fix javax.net.ssl.SSLHandshakeException and KubernetesAPIJavaClient