AKS中配置MySQL SSL CA证书遇HANDSHAKE_SSL_ERROR错误求助
解决AKS中MySQL SSL CA证书环境变量配置的HANDSHAKE_SSL_ERROR问题
我之前处理过完全一样的场景,终端能正常连接但AKS里的应用却报HANDSHAKE_SSL_ERROR: unable to get local issuer certificate,核心问题出在直接把CA证书文本塞进环境变量时的换行符丢失/格式损坏。
为什么会这样?
终端用MySQL客户端连接时,读取的是完整格式的证书文件,换行符和特殊字符都保留完整。但你直接把证书内容写在Deployment的value字段里时,YAML解析器会自动把换行转换成空格或者忽略,导致证书变成了一串没有正确分隔的文本——应用拿到的不是有效的PEM格式证书,自然无法完成SSL握手。
正确的解决方案:用Kubernetes Secret存储证书
Secret是Kubernetes专门用来存储敏感、带格式文本的资源,能完美保留证书的原始格式。分两步操作:
1. 创建存储CA证书的Secret
在本地终端执行命令,把你的CA证书文件导入成Secret:
kubectl create secret generic mysql-ca-cert --from-file=ca.pem=/path/to/your/actual-ca-cert.pem
这里ca.pem是Secret里存储证书的密钥名,后面的路径替换成你本地CA证书的实际路径。
2. 修改Deployment.yml配置
有两种可选方案,推荐第一种(挂载文件)更稳妥:
方案一:挂载证书文件到容器,让应用读取文件路径
在Deployment的volumes和containers.volumeMounts里添加挂载配置,同时修改环境变量指向证书文件路径:
apiVersion: apps/v1 kind: Deployment metadata: name: your-app-deployment spec: replicas: 1 selector: matchLabels: app: your-app template: metadata: labels: app: your-app spec: volumes: # 定义要挂载的Secret卷 - name: mysql-ca-volume secret: secretName: mysql-ca-cert # 对应刚才创建的Secret名称 containers: - name: your-app-container image: your-app-image:tag volumeMounts: # 把Secret卷挂载到容器内的指定路径 - name: mysql-ca-volume mountPath: /etc/mysql/certs readOnly: true env: # 环境变量指向挂载后的证书文件路径 - name: database__connection__ssl__ca value: "/etc/mysql/certs/ca.pem"
方案二:直接从Secret读取证书内容到环境变量
如果你的应用必须从环境变量读取证书文本,可以用valueFrom从Secret中获取,Kubernetes会自动处理格式:
env: - name: database__connection__ssl__ca valueFrom: secretKeyRef: name: mysql-ca-cert # 你的Secret名称 key: ca.pem # Secret里存储证书的密钥名
验证步骤
部署完成后,你可以进入容器确认证书是否正常:
- 如果用挂载文件方案:
kubectl exec -it <你的Pod名称> -- cat /etc/mysql/certs/ca.pem,检查输出和原证书格式一致 - 如果用环境变量方案:
kubectl exec -it <你的Pod名称> -- echo "$database__connection__ssl__ca",看证书的换行和分隔是否完整
这样修改后,应用就能拿到完整有效的CA证书,SSL握手错误应该就能解决了。
内容的提问来源于stack exchange,提问作者Kristóf Iváncza




