AKS私有Nginx Ingress 308重定向与HTTPS连接故障排查
问题根因说明
两个现象分别对应配置偏差,其中308跳转本身不属于异常:
- 未加特殊注解时访问HTTP端点返回
308 Permanent Redirect是Nginx Ingress的默认行为:只要Ingress资源配置了tls段,控制器默认会将80端口的HTTP请求强制跳转到443端口的HTTPS,属于符合安全预期的设计,不是故障。你之前添加nginx.ingress.kubernetes.io/ssl-redirect: "false"是直接关闭了强制跳转逻辑,该操作本身不会禁用HTTPS端口,当时HTTPS无法访问是证书配置错误导致的。 - HTTPS访问返回
SSL certificate problem: unable to get local issuer certificate的核心原因是Secrets Store CSI Driver同步出的TLS证书不包含完整信任链,同时存在命名空间配置错误导致Ingress控制器可能读取不到正确的证书内容。
修复步骤
1. 修正SecretProviderClass配置
首先确认Azure Key Vault中存储的是证书(Certificate)类型对象(而非单独的Secret对象),且导入证书时上传了完整信任链(包含服务端叶子证书、中间CA证书、根CA证书,不要仅上传单独的叶子证书)。
按如下内容调整SecretProviderClass配置,注意必须部署在ingress-nginx命名空间(和Nginx Ingress控制器同命名空间):
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-tls namespace: ingress-nginx spec: provider: azure secretObjects: - secretName: ingress-tls-csi type: kubernetes.io/tls namespace: ingress-nginx data: - objectName: <你的Key Vault证书名称> key: tls.key - objectName: <你的Key Vault证书名称>-chain key: tls.crt parameters: usePodIdentity: "false" useVMManagedIdentity: "true" userAssignedIdentityID: <有权限访问Key Vault的托管标识GUID> keyvaultName: <Key Vault实例名称> objects: | array: - | objectName: <你的Key Vault证书名称> objectType: cert tenantId: <Key Vault所属租户GUID>
配置注意点:
- 托管标识必须配置Key Vault的「证书获取」「密钥获取」权限,仅配置Secret权限无法读取证书内容
- 证书公钥部分必须使用
<证书名>-chain对象,该对象由Azure CSI驱动自动生成,包含完整证书信任链,直接用证书名只会拿到不带CA链的单独叶子证书,是导致证书校验报错的核心原因objectType必须设为cert,不能设为secret
2. 触发证书同步并验证Secret生成
重新应用修正后的SecretProviderClass配置后,重启Ingress控制器Pod,触发CSI驱动同步Key Vault中的证书内容到K8s Secret:
kubectl rollout restart deployment/nginx-ingress-ingress-nginx-controller -n ingress-nginx
等待Pod重启完成后,检查TLS Secret是否成功生成:
kubectl get secret ingress-tls-csi -n ingress-nginx
如果命令能返回对应Secret资源,说明证书同步成功;如果查不到Secret,排查kube-system命名空间下csi-secrets-store-前缀的CSI驱动Pod日志,以及Ingress控制器Pod日志,常见原因包括托管标识权限不足、证书名称拼写错误、Key Vault防火墙拦截AKS节点访问。
3. 调整Ingress资源配置
- 删除之前添加的
nginx.ingress.kubernetes.io/ssl-redirect: "false"注解,保持默认的HTTPS强制跳转逻辑(如果确实需要同时开放HTTP明文访问,可以保留该注解,证书同步完成后HTTPS端口可正常工作,生产环境不建议关闭强制跳转) - 在Ingress的metadata.annotations段添加如下注解,指定从ingress-nginx命名空间读取TLS证书(因为证书Secret生成在ingress-nginx命名空间,默认Ingress只会查找自身所在命名空间的Secret):
调整完成后重新应用Ingress配置。nginx.ingress.kubernetes.io/ssl-secret-namespace: "ingress-nginx"
4. 功能验证
- 验证HTTP跳转:执行
curl -v http://ingress.cluster.apaca.demo.com,返回308跳转到HTTPS地址为正常现象,符合安全预期 - 验证HTTPS访问:
- 如果使用公共可信CA签发的证书,直接执行
curl -v https://ingress.cluster.apaca.demo.com即可返回200业务状态码,无证书报错 - 如果使用内部私有CA/自签名证书,需要在访问客户端的信任根证书库中添加对应的根CA证书,之后访问就不会出现证书颁发者校验错误。
- 如果使用公共可信CA签发的证书,直接执行
内容的提问来源于stack exchange,提问作者Ashwin Agarkhed
相关产品推荐
相关产品推荐

