Kubernetes 机密和 Spring 启动配置



我们的服务在 kubernetes 集群中运行。 我正在尝试使我们的服务受到SSL的保护。

为此,我添加到 application.properties:

security.require-ssl=true 
server.ssl.key-store-type=JKS
server.ssl.key-store=serviceCertificates.jks
server.ssl.key-store-password=${KEYSTORE_PASSWORD}
server.ssl.key-alias=certificate

我想从 kubernetes secret 中获取的密钥库密码,该密码在集群中定义。
当服务开始运行时,我收到错误Password verification failed

"org.apache.catalina.LifecycleException: 无法启动组件 [Connector[HTTP/1.1-8080]]\tat org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)\tat org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)\tat org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addBeforeRemovedConnectors(TomcatWebServer.java:256)\tatorg.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:198)\tat org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:300)\tat org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162)\tatorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)\tat org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)\tat org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)\tat org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)\tatorg.springframework.boot.SpringApplication.run(SpringApplication.java:327)\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)\tat com.ibm.securityservices.cryptoutils.Application.main(Application.java:9)\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\tat java.lang.reflect.Method.invoke(Method.java:498)\tat org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)\tat org.springframework.boot.loader.Launcher.launch(Launcher.java:87)\tat org.springframework.boot.loader.Launcher.launch(Launcher.java:50)\tatorg.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)由: org.apache.catalina.LifecycleException: Protocol handler start failed\tat org.apache.catalina.connector.Connector.startInternal(Connector.java:1020)\tat org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)\t...省略了 21 个常见帧由以下原因引起: java.lang.IllegalArgumentException: 密钥库被篡改,或密码不正确\tat org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:116)\tat org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:87)\tat org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:225)\tat org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1150)\tat org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:591)\tat org.apache.catalina.connector.Connector.startInternal(Connector.java:1018)\t...省略了 22 个常见帧由以下原因引起:java.io.IOException:密钥库被篡改或密码不正确\tat sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:780)\tat sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)\tat sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)\tat sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)\tatjava.security.KeyStore.load(KeyStore.java:1445)\tat org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:139)\tat org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204)\tat org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:184)\tat org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)\t...省略了 27 个常见帧由以下原因引起:java.security.无法恢复密钥异常:密码验证失败\tat sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:778)\t...省略了 35 个常见帧"}

我的调查:
1.如果我打印在代码中

System.out.println("KEYSTORE_PASSWORD: "+ System.getenv("KEYSTORE_PASSWORD"));   

我看到了它的正确值。
2.如果我在应用程序属性中设置硬编码的常量密码值,它可以工作,服务已启动并正在运行。

所以我想问题是将秘密值设置为应用程序属性。
您的帮助和建议将不胜感激

我认为您的秘密描述符中有错别字或隐藏字符。您可以执行 进入 pod ,验证系统属性,并尝试使用命令行工具解密密码。

最新更新