目录
一、背景
二、更新支付系统银行证书
三、备份旧的secret信息
四、更新支付应用的证书信息
五、重启支付系统的应用
六、验证应用实例挂载的秘钥已更新
支付系统是基于k8s容器化部署的微服务,支付系统使用的支付证书以及和银行有关的证书都是保存在k8s的secret秘钥文件中。
由于测试环境和生产环境的文件名,应用名都是保存一致的,这里仅以测试环境更新支付系统支付证书来演示。测试环境和生产环境不同之处是k8s环境和版本不一致,以及支付应用所在的命名空间不同。
# 备份支付系统的secret证书,保存到当前服务器并另命名文件名为: pay-platform-cert.yaml
kubectl -n test-pay get secrets pay-platform-cert -o yaml > pay-platform-cert.yaml
由于需要更新的TrustPay.cer证书文件无法直接查看,需要通过特别的工具查看。又因为保存在k8s的secret文件的内容不是明文,都是通过base64加密的,所以就算能直接查看证书信息也不能直接替换到secret对应的key中,需要先将明文通过base64加密后,才能替换到k8s的secret对应的key中。
首先将证书文件TrustPay.cer创建一个名为test的secret,就可以直接复制新建的名为test的secret的key为TrustPay.cer的内容来替换支付系统的secret文件pay-platform-cert中名为TrustPay.cer的key的内容(毕竟都是base64加密的结果)
1、创建名为test的secret临时使用,主要是直接得到证书通过base64加密后的结果
# 创建一个名为test的secret文件,TrustPay.cer为银行提供的新的证书文件
kubectl -n test-pay create secret generic test --from-file=TrustPay.cer
# 查看新建的名为test的secret
kubectl -n test-pay get secret test
2、替换支付系统的证书文件对应的key为TrustPay.cer的值
# 复制名为test的临时的secret的,并且key为TrustPay.cer的值来替换 名为pay-platform-cert的secret中key为TrustPay.cer的值
kubectl -n test-pay edit secret pay-platform-cert
# 执行命令 kubectl -n test-pay edit secret pay-platform-cert 将可以直接在线修改名为 pay-platform-cert的secret内容
执行命令 kubectl -n test-pay edit secret pay-platform-cert ,将会出现类似下图的内容,表明此刻可以直接修改当前名为pay-platform-cert的secret的内容(修改完成后保存就会生效)
3、将新建名为test的secret的且名为TrustPay.cer的key值复制替换到pay-platform-cert的secret对应的名为TrustPay.cer的key的内容;即将下图圆圈的内容替换到上图圆圈圈住的内容
更新完成支付系统的秘钥信息后,需要重启支付系统的应用来生效,要不然应用不能及时读取到更新后的证书信息;重启支付应用后,可以登录到对应的应用查看应用更新后的证书到期时间更好确认证书已更新(以及进行对应的业务验证测试,保证更新证书后,业务正常可用)
# 重启支付应用(无状态负载,且无状态应用名是:pay-platform )的命令是:
kubectl -n test-pay rollout restart deploy pay-platform
查看TrustPay.cer证书文件到期时间的命令是:
# 查看TrustPay.cer证书文件到期时间的命令
openssl x509 -inform der -in TrustPay.cer -text
在我的环境证书文件挂载在容器应用的目录是: /opt/pay_platform_file/abc/cert/
当前挂载证书文件的其中一个实例是: pay-platform-58d7cd5598-9k9nc
# 登录支付容器实例验证证书文件到期时间 (需要容器已安装openssl工具)
kubectl -n test-pay exec -it pay-platform-58d7cd5598-9k9nc -- openssl x509 -inform der -in /opt/pay_platform_file/abc/cert/TrustPay.cer -text
成功更新证书文件后,可以考虑把前面创建的名为test的临时secret 删除。
# 删除前面创建临时的名为 test的secret
kubectl -n test-pay delete secret test