基于 Ingress-Nginx 实现 mTLS 双向认证

ops/2025/3/4 13:22:23/

目录

背景描述:

TLS 和 MTLS 之间的差异

通过自签名证书启用双向 TLS

1.  生成证书

(1)  生成 CA(根证书颁发机构)

(2)  生成 CA(根证书颁发机构)

(3)  生成客户端证书

2. 在 Kubernetes 中配置 mTLS

(1)创建 CA 证书 Secret

(2)创建服务器证书 Secret

ingress-nginx-toc" name="tableOfContents" style="margin-left:40px">3. 配置 ingress-nginx

ingress-nginx%20%E6%8E%A7%E5%88%B6%E5%99%A8-toc" name="tableOfContents" style="margin-left:80px">(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 连接。

ingress-nginx" name="3.%20%E9%85%8D%E7%BD%AE%20ingress-nginx">3. 配置 ingress-nginx

ingress-nginx%20%E6%8E%A7%E5%88%B6%E5%99%A8" name="(1)%20%E9%85%8D%E7%BD%AE%20ingress-nginx%20%E6%8E%A7%E5%88%B6%E5%99%A8">(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 访问控制、微服务安全通信提供了强有力的保障。


http://www.ppmy.cn/ops/163052.html

相关文章

校园快递平台系统(小程序论文源码调试讲解)

第4章 系统设计 用户对着浏览器操作,肯定会出现某些不可预料的问题,但是不代表着系统对于用户在浏览器上的操作不进行处理,所以说,要提前考虑可能会出现的问题。 4.1 系统设计思想 系统设计,肯定要把设计的思想进行统…

【开源-常用C/C++命令行解析库对比】

以下是几种常用的C/C命令行解析库的对比表格,以及它们的GitHub开源库地址: 库名称语言特点是否支持子命令是否支持配置文件是否支持自动生成帮助信息GitHub地址ClaraC11及以上单一头文件,轻量级,非异常错误处理,自动类…

HTML元素,标签到底指的哪块部分?单双标签何时使用?

1. 标签&#xff08;Tag&#xff09; vs 元素&#xff08;Element&#xff09; 标签&#xff08;Tag&#xff09; 标签是 HTML 中用于定义元素的符号&#xff0c;用尖括号 < > 包裹。例如 <img> 是标签。元素&#xff08;Element&#xff09; 元素是由 标签 内容…

芯麦GC1277:电脑散热风扇驱动芯片的优质之选 并可替代传统的0CH477/灿瑞芯片。

在电脑散热风扇、小型电机驱动等场景中&#xff0c;驱动芯片的选型直接影响系统效率、噪音控制及长期可靠性。灿瑞的0CH477曾是市场主流方案&#xff0c;但随着国产芯片技术的成熟&#xff0c;芯麦半导体推出的GC1277凭借更优的驱动性能、智能化保护机制及成本优势&#xff0c;…

【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备

在开发实时数据监控应用时&#xff0c;记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架&#xff0c;介绍如何实现一个实时记录接口请求延迟的功能&#xff0c;并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…

git的恢复命令

右键查看 找到版本的 提交ID git reset --soft c097b534188163194fa0e00a20d9e0f07ad82549

word转换为pdf后图片失真解决办法、高质量PDF转换方法

1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker &#xff08;1&#xff09;点击word选项卡上的Acrobat插件&#xff0c;&#xff08;2&#xff09;点击“首选项”按钮&#xff0c;&#xff08;3&#xff09;点击“高级配置”按钮&#xff08;4&#xff09;点…

蓝桥杯复盘记录004(2023)

涉及知识点 1.深搜 2.单调队列滑动窗口 3.位运算 4.并查集 题目 1.lanqiao3505 思路&#xff1a; dfs(index, weight, cnt) index表示瓜的索引&#xff0c; weight等于买瓜的重量&#xff0c; cnt表示买了多少瓜。 递归终止条件&#xff1a;1.如果瓜买完了&#xff0c;归…