You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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的volumescontainers.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

火山引擎 最新活动