基于 Ingress-Nginx 实现 mTLS 双向认证
目录
背景描述:
TLS 和 MTLS 之间的差异
通过自签名证书启用双向 TLS
1. 生成证书
(1) 生成 CA(根证书颁发机构)
(2) 生成 CA(根证书颁发机构)
(3) 生成客户端证书
2. 在 Kubernetes 中配置 mTLS
(1)创建 CA 证书 Secret
(2)创建服务器证书 Secret
3. 配置 ingress-nginx
(1) 配置 ingress-nginx 控制器
(2) 配置 Ingress 资源
4. 客户端访问
(1) 当不带客户端证书进行请求
(2) 使用客户端证书进行请求
关于证书到期问题及应对方案
证书有效期规划
总结
背景描述:
在微服务架构中,安全性是至关重要的考虑因素。特别是在 Kubernetes 环境下,Ingress 作为流量入口,承担着重要的安全网关角色。默认情况下,Ingress-Nginx 仅支持 TLS 单向认证,即客户端验证服务器的证书,而 mTLS(Mutual TLS,双向 TLS 认证)则进一步增强了安全性,要求客户端也提供受信任的证书,以实现双向身份验证。
mTLS 适用于需要严格身份认证的场景,如:
• API 网关安全访问:确保只有受信任的客户端可以访问微服务。
• 微服务间通信:保证服务之间的互相信任,防止未授权的请求。
• 企业内部系统安全加固:防止外部流量冒充合法客户端访问敏感数据。

TLS 和 MTLS 之间的差异
传输层安全性 (TLS)是一种用于保护计算机网络通信的协议。它为通过互联网通信的两台设备之间或客户端与服务器之间提供安全通道。
TLS 使用公钥和 TLS 证书加密的组合来保护数据传输。在 TLS 连接中,客户端和服务器交换消息以协商一组将用于保护连接的加密密钥。协商密钥后,客户端和服务器将使用它们来加密和解密它们之间传输的数据。TLS 证书可以称为 SSL 证书,这是因为TLS 是 SSL(安全套接字层)的演进版本。
相互 TLS (mTLS) 是 TLS 的升级版,要求客户端和服务器使用数字证书相互验证身份。在相互 TLS 连接中,客户端向服务器出示自己的证书,服务器向客户端出示自己的证书。这可确保客户端和服务器的身份真实,从而为连接提供额外的安全保障。
本篇文章将介绍如何在 Kubernetes 集群中,基于 Ingress-Nginx 配置 mTLS,实现服务端与客户端的双向认证,并支持证书校验,以确保数据传输的安全性。
通过自签名证书启用双向 TLS
我们将添加一个额外的安全层,即客户端证书验证。这有助于确保只有授权的客户端才能与服务器建立安全连接,并可以防止未经授权访问敏感信息。因此,我们将创建一个 CA (证书颁发机构)作为我们的验证门,以及客户端的证书和密钥,它们是客户端的可信身份。
MTLS认证过程

1. 生成证书
(1) 生成 CA(根证书颁发机构)
首先让我们创建一个 CA。CA 的主要目的是确认证书持有者的身份,以便证书接收者可以相信该证书是由信誉良好且值得信赖的实体颁发的。
# 生成 CA 私钥
openssl genrsa -out ca.key 2048
# 生成 CA 证书
openssl req -x509 -new -nodes -key ca.key -subj "/CN=MyCA" -days 365 -out ca.crt
解释:
• genrsa -out ca.key 2048:生成 2048 位的私钥。
• req -x509 -new -nodes -key ca.key -subj "/CN=MyCA" -days 365 -out ca.crt:使用该私钥创建 CA 证书,并设置证书有效期为 365 天。
(2) 生成 CA(根证书颁发机构)
Ingress 需要一个服务器证书用于 TLS 认证。
# 生成服务器私钥
openssl genrsa -out server.key 2048# 生成服务器证书请求(CSR)
openssl req -new -key server.key -subj "/CN=example.com" -out server.csr# 使用 CA 签发服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
解释:
• genrsa -out server.key 2048:生成服务器私钥。
• req -new -key server.key -subj "/CN=example.com" -out server.csr:创建服务器证书请求(CSR),CN=example.com 代表服务器域名。
• x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365:使用 CA 证书签发服务器证书。
(3) 生成客户端证书
客户端证书用于身份验证,确保只有持有有效证书的客户端可以访问服务。
# 生成客户端私钥
openssl genrsa -out client.key 2048# 生成客户端证书请求(CSR)
openssl req -new -key client.key -subj "/CN=client" -out client.csr# 使用 CA 签发客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
2. 在 Kubernetes 中配置 mTLS
(1)创建 CA 证书 Secret
kubectl create secret generic mtls-ca-secret --from-file=ca.crt -n ingress-nginx
用于 Ingress-Nginx 认证客户端证书。
(2)创建服务器证书 Secret
kubectl create secret tls mtls-server-secret --cert=server.crt --key=server.key -n ingress-nginx
用于 Ingress 认证 TLS 连接。
3. 配置 ingress-nginx
(1) 配置 ingress-nginx 控制器
启用 SSL 透传(Pass-through TLS):
修改 ingress-nginx 的 ConfigMap,开启 enable-ssl-passthrough 选项,使 Nginx 允许客户端证书透传到后端服务。
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-configurationnamespace: ingress-nginx
data:enable-ssl-passthrough: "true"
(2) 配置 Ingress 资源
使用 nginx.ingress.kubernetes.io/auth-tls-secret 注解启用 mTLS。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressnamespace: ingress-nginxannotations:nginx.ingress.kubernetes.io/auth-tls-secret: "ingress-nginx/mtls-ca-secret"nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
spec:ingressClassName: nginxrules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-app-serviceport:number: 80tls:- hosts:- example.comsecretName: mtls-server-secret
解释:
• nginx.ingress.kubernetes.io/auth-tls-secret:指定 CA 证书 Secret,用于验证客户端证书。
• nginx.ingress.kubernetes.io/auth-tls-verify-client: "on":启用客户端证书验证。
• nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true":将客户端证书传递到后端服务。
4. 客户端访问
使用 curl 命令携带客户端证书访问 Ingress。需要将生成好的client.crt client.key 发放给客户端
curl -k https://example.com --key client.key --cert client.crt -v
如果一切正常,服务器会返回 200 OK,否则可能会返回 400 Bad Request,表示客户端未提供有效证书。
(1) 当不带客户端证书进行请求
curl -k -v https://pre-xxx.xxx.cn/api

(2) 使用客户端证书进行请求
curl -k -v https://pre-xxx.xxx.cn/api --key client.key --cert client.crt

关于证书到期问题及应对方案
在使用 mTLS 进行安全认证时,证书的有效期至关重要。一旦证书过期,TLS 连接将无法建立,导致服务不可用。因此,了解证书的有效期管理和更新策略是保障系统稳定运行的关键。
-
证书有效期规划
在首次生成证书时,可以采用以下策略:
• CA 证书(根证书)有效期设置较长,如 10 年,避免频繁更换。
• 服务器证书 有效期可以设置 1~3 年,减少更新频率。
• 客户端证书 由于安全性考虑,建议设置 6 个月 ~ 1 年,并定期更新。
总结
本文介绍了如何使用 OpenSSL 生成 CA 证书、服务器证书和客户端证书,并在 Kubernetes 中配置 Ingress-Nginx 以实现 mTLS 双向认证。通过 mTLS 认证,Ingress-Nginx 既可以验证客户端身份,又可以确保数据安全传输,为 API 访问控制、微服务安全通信提供了强有力的保障。
相关文章:
基于 Ingress-Nginx 实现 mTLS 双向认证
目录 背景描述: TLS 和 MTLS 之间的差异 通过自签名证书启用双向 TLS 1. 生成证书 (1) 生成 CA(根证书颁发机构) (2) 生成 CA(根证书颁发机构) (3) 生成客户端证书 2. 在 Kubernetes 中配置 mTLS &#x…...
学到什么记什么(25.3.3)
Upload-labs 今日重新做了一下文件上传漏洞,这里第一题之前采用直接抓包改后缀名.jpg为.php,再写入一句话<?php phpinfo();?>然后放行,得到图片地址(可复制),本来直接访问图片地址即可得到敏感信息…...
【子网掩码计算器:Python + Tkinter 实现】
子网掩码计算器:Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…...
《解锁HarmonyOS NEXT高阶玩法:艺术图像识别功能开发全攻略》
在当今数字化时代,AI技术不断拓展其应用边界,为各行业带来前所未有的变革。在艺术领域,AI图像识别技术能够帮助艺术从业者、爱好者快速识别艺术品风格、作者,甚至挖掘艺术品背后的历史文化信息。本文将结合HarmonyOS NEXT API 12及…...
Spring Boot的启动流程
Spring Boot 的启动流程是一个复杂且有序的过程: 创建SpringApplication实例 — 调用run方法 — 启动完成(发布应用启动事件,配置环境,创建ApplicationContext,准备ApplicationContext,刷新ApplicationContext[【创建B…...
【通俗讲解电子电路】——从零开始理解生活中的电路(三)
实际应用案例:生活中的电子电路 ——拆解你身边的“隐形工程师” 1. 手电筒电路:最简单的直流系统 电路组成 电源:2节1.5V电池(串联3V)。 开关:按钮控制回路通断。 LED:发光二极管ÿ…...
TypeScript系列01-类型系统全解析
本文总结了 TypeScript 的类型系统基础,涵盖了: TypeScript 的价值:静态类型检查为 JavaScript 添加了类型安全保障基本类型系统:从原始类型到特殊类型(any、unknown、never)的完整介绍类型注解与推断&…...
ragflow-mysql 启动失败案例分析
一、问题描述 1.拉取RAGflow镜像失败 dependency failed to start: container ragflow-mysql is unhealthy2. 查询日志 docker logs ragflow-mysql显示 出现[rootlocalhost docker]# docker logs ragflow-mysql Fatal glibc error: CPU does not support x86-64-v2 Fatal …...
SslConnection::SslConnection()详解
一、🔍 SslConnection::SslConnection() 详解 这个构造函数的主要作用是: 创建 SSL 对象创建 BIO(I/O 缓冲区)初始化 SSL 服务器模式绑定回调函数(onRead() 处理接收数据) 📌 1. 初始化 SSL 相…...
unity lua属性绑定刷新
我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…...
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks #paper/GFM/GNN-BASED# #paper/⭐⭐⭐# 注意:这篇文章是每个图一个GCN模型,而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机: 非对…...
企业级-数据分类分级详细方案
一、方案背景 在数字化时代,数据成为企业和组织的核心资产。随着数据量的快速增长和数据应用场景的不断拓展,如何有效地管理和保护数据,确保数据的安全性、合规性和可用性,成为了亟待解决的问题。数据分类分级作为数据管理的基础工作,能够帮助企业清晰地了解自身的数据资…...
本地部署Qwen2.5-VL-7B-Instruct模型
本地部署Qwen2.5-VL-7B-Instruct模型 本地部署Permalink **创建环境** conda create -n qwenvl python3.11 -y# 报错: Solving environment: failedPackagesNotFoundError: The following packages are not available from current channels:# 处理: c…...
【前端】简单原生实例合集html,css,js
长期补充,建议关注收藏点赞。 目录 a标签设置不一样的花样(图片但不用img)侧边固定box分栏input各种类型iframe表单拖拽 a标签设置不一样的花样(图片但不用img) a标签里面不用嵌套img,直接设置为其bg-img即可 <!DOCTYPE html…...
【Spring】配置文件的使用
在Spring框架中,application.properties(或application.yml)文件用于配置Spring应用程序的各种属性。我们可以通过多种方式来使用这些配置,包括使用Value和ConfigurationProperties注解来绑定配置到Java对象。 下面是对不同配置类…...
MOM成功实施分享(七)电力电容制造MOM工艺分析与解决方案(第一部分)
声明:文章仅用于交流学习,不用于商业项目实施,图片来源于网络,如有侵犯权利,请联系作者及时删除。 本方案旨在对电力电容(PEC和PQM型号)制造工艺深度分析,结合管理要求设计MOM相关功…...
计算机毕业设计SpringBoot+Vue.js航空机票预定系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python 爬取唐诗宋词三百首
你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例,它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…...
【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】
最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…...
商城源码的框架
商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架: WooCommerce:基于WordPress的电子商务插件,适用于小型到中型的在线商店。 Magento:一个功能强大和灵活的开源电子商务平台&am…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
