OpenShift Pod内TWAS基础运行时如何部署第三方TLS证书
OpenShift传统TWAS运行时第三方TLS证书配置方案(零J2EE应用代码修改)
以下方案全部适配传统TWAS(非Liberty)运行时,支持.crt/.pem格式的无私钥公网证书,不需要对迁移的应用做任何代码改动,配置效果和虚拟机环境下通过管理控制台操作信任库完全一致。
方案1:镜像构建阶段预置证书(生产环境首选,稳定性最高)
这个方案的逻辑是直接把证书打进应用镜像,提前写入TWAS默认信任库,Pod启动后直接可用,没有运行时额外操作。
操作步骤:- 将你持有的第三方公网证书(.crt/.pem格式)放到TWAS应用镜像的构建上下文目录中
- 在Dockerfile中调用TWAS内置JDK带的
keytool工具,将证书导入TWAS默认的CellDefaultTrustStore信任库——这个就是你之前在管理控制台操作的同一个信任库,默认存储路径为/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/trust.p12,默认访问密码为WebAS(如果你之前在虚拟机环境修改过信任库密码,替换成实际密码即可) - Dockerfile参考片段:
# 将本地证书拷贝到镜像内临时目录 COPY ./third-party-api.crt /tmp/ COPY ./third-party-api.pem /tmp/ # 执行证书导入命令,-noprompt参数跳过交互确认 RUN /opt/IBM/WebSphere/AppServer/java/8.0/bin/keytool -importcert \ -alias third-party-api-prod \ -file /tmp/third-party-api.crt \ -keystore /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/trust.p12 \ -storetype PKCS12 \ -storepass WebAS \ -noprompt # 如果使用pem格式证书,仅需替换上面-file参数的文件路径为pem文件路径即可 - 用该Dockerfile重新构建镜像后部署到OpenShift,TWAS启动后会自动加载信任库配置,应用调用外部HTTPS接口时就会信任对应证书。
方案2:Pod启动阶段动态挂载注入证书(适合证书轮换频繁场景,无需重构镜像)
如果你的第三方证书更新频率高,不想每次换证书都重新构建镜像,可以用OpenShift的Secret+启动钩子的方式动态注入:
操作步骤:- 先将证书文件创建为OpenShift Secret:
oc create secret generic twas-trusted-certs \ --from-file=third-party-api.crt=./local-third-party-cert.crt \ --from-file=third-party-api.pem=./local-third-party-cert.pem - 在应用的Deployment/DeploymentConfig配置中,将上述Secret挂载到Pod内的临时目录,比如
/tmp/pod-trusted-certs - 配置容器的postStart启动钩子,在TWAS进程启动前执行证书导入逻辑,先判断证书是否已存在避免重复导入报错:
# 先查询别名是否存在,不存在才执行导入 /opt/IBM/WebSphere/AppServer/java/8.0/bin/keytool -list \ -alias third-party-api-prod \ -keystore /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/trust.p12 \ -storepass WebAS \ 2>/dev/null || /opt/IBM/WebSphere/AppServer/java/8.0/bin/keytool -importcert \ -alias third-party-api-prod \ -file /tmp/pod-trusted-certs/third-party-api.crt \ -keystore /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/trust.p12 \ -storepass WebAS \ -noprompt
注意:需要适当调大容器启动探针的初始延迟时间,给证书导入操作留足执行窗口,避免TWAS已经启动完成但证书还没导入,导致第一次调用外部接口报证书不信任错误。
- 先将证书文件创建为OpenShift Secret:
方案3:wsadmin脚本自动化配置(完全对齐控制台操作逻辑)
如果你不想直接操作keystore文件,可以用TWAS原生的wsadmin管理工具执行Jython脚本完成配置,操作逻辑和你在管理控制台手动点选导入证书完全等价:- 编写证书导入的Jython脚本
import-cert.py:# 导入证书到Cell默认信任库 AdminTask.importCertificate('[ -keyStoreName CellDefaultTrustStore -certificateFilePath /tmp/third-party-api.crt -alias third-party-api-prod ]') # 保存配置 AdminConfig.save() - 你可以选择在镜像构建阶段把脚本打进镜像执行,或者在Pod启动阶段挂载脚本执行,执行命令为:
/opt/IBM/WebSphere/AppServer/bin/wsadmin.sh -lang jython -f /tmp/import-cert.py -conntype NONE
- 编写证书导入的Jython脚本
注意事项
- 不要把证书导入到JRE自带的
cacerts信任库,传统TWAS默认不会读取JRE层的cacerts作为应用HTTPS调用的信任源,必须导入到TWAS自身的信任库才能生效。 - 如果你之前在虚拟机环境给应用配置了独立的自定义信任库,没有用默认的
CellDefaultTrustStore,只需要把上述命令里的keystore路径、wsadmin脚本里的keyStoreName替换成你实际使用的信任库配置即可,逻辑完全一致。 - 所有操作仅导入公钥证书,不需要提供证书私钥,和你之前虚拟机环境的证书要求完全匹配。
内容的提问来源于stack exchange,提问作者Marcer
相关产品推荐
相关产品推荐

