Kubernetes部署求助:Ingress Controller适配指定CN自签名证书
问题描述
背景
- 拥有一个.NET REST API应用,作为最终用户与MotherAPP之间的中间件
- 向SPA应用暴露REST API供最终用户使用
- 对外暴露2个SOAP Service以接收MotherAPP的通知
- MotherAPP要求为这两个SOAP Service使用指定CN(通用名称为xxxxxx,不可修改)的自签名证书,实现双向通信安全
已完成部署操作
- 创建了Deployment(当前1个副本)
- 创建了ClusterIP Service用于集群内暴露Pod
- 需要配置两个Ingress:一个使用域名提供商颁发的证书供API使用,另一个使用上述自签名证书供SOAP Service使用
遇到的问题
已安装Nginx Ingress Controller,但无法创建与证书CN不匹配的Ingress,Nginx返回错误:
"x509: certificate is not valid for any names, but wanted to match [host]"
后续尝试(更新)
在minikube环境中按照官方指南创建Ingress Controller和Ingress,添加以下注解试图绕过CN检查,但Ingress仍返回默认Kubernetes证书:
nginx.ingress.kubernetes.io/proxy-ssl-verify: "off"nginx.ingress.kubernetes.io/proxy-ssl-server-name: "fe.com"nginx.ingress.kubernetes.io/proxy-ssl-name: "fe.com"
解决方案与替代方案
方案1:为SOAP Service单独部署Nginx Ingress Controller实例
Nginx Ingress Controller支持多实例部署,可专为SOAP Service配置独立实例:
- 部署第二个Nginx Ingress Controller,通过
--ingress-class参数指定唯一标识(如soap-ingress) - 将自签名证书和密钥创建为Kubernetes Secret,确保Secret与该Controller的配置绑定
- 创建SOAP Service对应的Ingress时,添加注解
kubernetes.io/ingress.class: soap-ingress,关联到专属Controller
方案2:为自签名证书添加Subject Alternative Names(SAN)
若MotherAPP允许(仅需确认是否可添加SAN,不修改指定CN),生成证书时补充与Ingress域名匹配的SAN字段,让证书同时兼容指定CN和访问域名:
# 示例命令:生成含指定CN和SAN的自签名证书 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 \ -subj "/CN=xxxxxx" \ -addext "subjectAltName=DNS:你的SOAP访问域名"
用生成的证书创建Secret后,关联到对应Ingress即可。
方案3:用NodePort/LoadBalancer直接暴露SOAP Service(绕过Ingress)
若Ingress证书匹配问题难以解决,可直接通过Service暴露SOAP Service:
- 创建NodePort或LoadBalancer类型的Service,配置端口映射
- 将自签名证书直接部署在.NET应用中,由应用自身处理TLS终止
- 提前将自签名证书导入MotherAPP的信任存储,确保双向通信信任
方案4:修改Nginx Ingress Controller全局SSL配置(仅适合测试/受控环境)
若必须复用同一个Ingress Controller,可修改其ConfigMap全局禁用证书名称验证(注意:此操作会降低安全性):
- 编辑Nginx Ingress Controller的ConfigMap(通常名为
nginx-ingress-controller) - 添加或修改配置项:
data: ssl-verify-client: "off" ssl-verify-depth: "0"
- 重启Ingress Controller Pod使配置生效
内容的提问来源于stack exchange,提问作者Dr.Gonzo
相关产品推荐
相关产品推荐

