spring-boot - 无法在 Openshift 4.3 的 Java spring boot 应用程序中启用 tls
问题描述
- 我在我的命名空间中添加了 JAVA_KEYSTORE_PASSWORD 作为秘密
- 在我的部署中使用 inicontainer 从 tls 密钥创建密钥库,并使用服务注释生成证书
service.beta.openshift.io/serving-cert-secret-name
。Initcontainer 使用docker.io/abc/cert:latest
从 jre-alpine 创建并在其上安装 openssl 的 docker 映像。
- name: pem-to-keystore
image: docker.io/abc/cert:latest
env:
- name: keyfile
value: /var/run/secrets/openshift.io/services_serving_certs/tls.key
- name: crtfile
value: /var/run/secrets/openshift.io/services_serving_certs/tls.crt
- name: keystore_pkcs12
value: /var/run/secrets/java.io/keystores/keystore.pkcs12
- name: keystore_jks
value: /var/run/secrets/java.io/keystores/keystore.jks
command: ['/bin/sh']
args: ['-c', "openssl pkcs12 -export -inkey $keyfile -in $crtfile -out $keystore_pkcs12 -password pass:$JAVA_KEYSTORE_PASSWORD && keytool -importkeystore -noprompt -srckeystore $keystore_pkcs12 -srcstoretype pkcs12 -destkeystore $keystore_jks -storepass $JAVA_KEYSTORE_PASSWORD -srcstorepass $JAVA_KEYSTORE_PASSWORD"]
volumeMounts:
- mountPath: /var/run/secrets/java.io/keystores
name: keystore-volume
- mountPath: /var/run/secrets/openshift.io/services_serving_certs
name: service-certs
volumes:
- name: keystore-volume
emptyDir: {}
- name: service-certs
secret:
secretName: ${APP_NAME}-${NAMESPACE}-service-serving-cert-secret
- 更新了 application.properties
server.ssl.key-store-type=JKS
server.ssl.key-store=/var/run/secrets/java.io/keystores/keystore.jks
server.ssl.key-store-password=${$JAVA_KEYSTORE_PASSWORD}
server.ssl.enabled=true
- 更新了 Dockerfile
ENTRYPOINT keytool -importcert -file /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt -keystore "$JAVA_HOME/lib/security/cacerts" -noprompt -storepass $JAVA_KEYSTORE_PASSWORD ; \
java $JAVA_OPTS -Dcom.jsse2.overrideDefaultTLS=true -Djava.security.egd=file:/dev/./urandom -jar app.jar
但我在 POD 中遇到错误
keytool error (likely untranslated): java.io.IOException: Keystore was tampered with, or password was incorrect
Caused by: java.lang.IllegalArgumentException: Keystore was tampered with, or password was incorrect
解决方案
密码在我自己设置的 application.properties 和 openssl 命令中有效。但它在我在 Dockerfile 中的命令下不起作用
keytool -importcert -file /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt -keystore "$JAVA_HOME/lib/security/cacerts" -noprompt -storepass $JAVA_KEYSTORE_PASSWORD
这在我使用 keytool 的默认密码时有效,changeit
之后错误消息消失了,我可以看到Certificate was added to keystore
另一种方法是更改 keytool 的默认密码并使用它。
推荐阅读
- google-photos-api - GOOGLE Photos API:获取 io.grpc.StatusRuntimeException:不可用:listAlbums 上的 io 异常
- java - Spring 不在 REST 控制器中执行验证
- java - Swing - 等待渲染完成
- google-docs - 选择文件后如何显示文档图标
- javascript - 如何使用响应式表单连接值?
- c# - 如何从 SQL 查询中获取“带有数据的模型”列表?
- python - 为什么我会收到 TweepError('需要身份验证!')?
- python - 如何将文本拆分为具有多字符分隔符(<=>、
)的列? - python - For and if in print python
- javascript - 如何在javascript中遍历对象数组并在其中找到相似的值?