当前位置: 首页 > news >正文

基于 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 连接将无法建立,导致服务不可用。因此,了解证书的有效期管理和更新策略是保障系统稳定运行的关键。

  1. 证书有效期规划

在首次生成证书时,可以采用以下策略:

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 今日重新做了一下文件上传漏洞&#xff0c;这里第一题之前采用直接抓包改后缀名.jpg为.php&#xff0c;再写入一句话<?php phpinfo();?>然后放行&#xff0c;得到图片地址&#xff08;可复制&#xff09;&#xff0c;本来直接访问图片地址即可得到敏感信息…...

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…...

《解锁HarmonyOS NEXT高阶玩法:艺术图像识别功能开发全攻略》

在当今数字化时代&#xff0c;AI技术不断拓展其应用边界&#xff0c;为各行业带来前所未有的变革。在艺术领域&#xff0c;AI图像识别技术能够帮助艺术从业者、爱好者快速识别艺术品风格、作者&#xff0c;甚至挖掘艺术品背后的历史文化信息。本文将结合HarmonyOS NEXT API 12及…...

Spring Boot的启动流程

Spring Boot 的启动流程是一个复杂且有序的过程&#xff1a; 创建SpringApplication实例 — 调用run方法 — 启动完成(发布应用启动事件&#xff0c;配置环境&#xff0c;创建ApplicationContext&#xff0c;准备ApplicationContext&#xff0c;刷新ApplicationContext[【创建B…...

【通俗讲解电子电路】——从零开始理解生活中的电路(三)

实际应用案例&#xff1a;生活中的电子电路 ——拆解你身边的“隐形工程师” 1. 手电筒电路&#xff1a;最简单的直流系统 电路组成 电源&#xff1a;2节1.5V电池&#xff08;串联3V&#xff09;。 开关&#xff1a;按钮控制回路通断。 LED&#xff1a;发光二极管&#xff…...

TypeScript系列01-类型系统全解析

本文总结了 TypeScript 的类型系统基础&#xff0c;涵盖了&#xff1a; TypeScript 的价值&#xff1a;静态类型检查为 JavaScript 添加了类型安全保障基本类型系统&#xff1a;从原始类型到特殊类型&#xff08;any、unknown、never&#xff09;的完整介绍类型注解与推断&…...

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()详解

一、&#x1f50d; SslConnection::SslConnection() 详解 这个构造函数的主要作用是&#xff1a; 创建 SSL 对象创建 BIO&#xff08;I/O 缓冲区&#xff09;初始化 SSL 服务器模式绑定回调函数&#xff08;onRead() 处理接收数据&#xff09; &#x1f4cc; 1. 初始化 SSL 相…...

unity lua属性绑定刷新

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候&#xff0c;我们需要刷新界面显示等级信息&#xff0c;通常我们是在收到等级升级成功的协议的时候&#xff0c;发送一个事件&#xff0c;UI界面接受到这个事件的时候&#xff0c;刷新一下等级…...

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/⭐⭐⭐#​ 注意&#xff1a;这篇文章是每个图一个GCN模型&#xff0c;而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机&#xff1a; 非对…...

企业级-数据分类分级详细方案

一、方案背景 在数字化时代,数据成为企业和组织的核心资产。随着数据量的快速增长和数据应用场景的不断拓展,如何有效地管理和保护数据,确保数据的安全性、合规性和可用性,成为了亟待解决的问题。数据分类分级作为数据管理的基础工作,能够帮助企业清晰地了解自身的数据资…...

本地部署Qwen2.5-VL-7B-Instruct模型

本地部署Qwen2.5-VL-7B-Instruct模型 本地部署Permalink **创建环境** conda create -n qwenvl python3.11 -y# 报错&#xff1a; Solving environment: failedPackagesNotFoundError: The following packages are not available from current channels:# 处理&#xff1a; c…...

【前端】简单原生实例合集html,css,js

长期补充&#xff0c;建议关注收藏点赞。 目录 a标签设置不一样的花样&#xff08;图片但不用img)侧边固定box分栏input各种类型iframe表单拖拽 a标签设置不一样的花样&#xff08;图片但不用img) a标签里面不用嵌套img&#xff0c;直接设置为其bg-img即可 <!DOCTYPE html…...

【Spring】配置文件的使用

在Spring框架中&#xff0c;application.properties&#xff08;或application.yml&#xff09;文件用于配置Spring应用程序的各种属性。我们可以通过多种方式来使用这些配置&#xff0c;包括使用Value和ConfigurationProperties注解来绑定配置到Java对象。 下面是对不同配置类…...

MOM成功实施分享(七)电力电容制造MOM工艺分析与解决方案(第一部分)

声明&#xff1a;文章仅用于交流学习&#xff0c;不用于商业项目实施&#xff0c;图片来源于网络&#xff0c;如有侵犯权利&#xff0c;请联系作者及时删除。 本方案旨在对电力电容&#xff08;PEC和PQM型号&#xff09;制造工艺深度分析&#xff0c;结合管理要求设计MOM相关功…...

计算机毕业设计SpringBoot+Vue.js航空机票预定系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…...

【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】

最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…...

商城源码的框架

商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架&#xff1a; WooCommerce&#xff1a;基于WordPress的电子商务插件&#xff0c;适用于小型到中型的在线商店。 Magento&#xff1a;一个功能强大和灵活的开源电子商务平台&am…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...