Kafka - 启用安全通信和认证机制_SSL + SASL
文章目录
- 官方资料
- 概述
- 制作kakfa证书
- 1.1 openssl 生成CA
- 1.2 生成server端秘钥对以及证书仓库
- 1.3 CA 签名证书
- 1.4 服务端秘钥库导入签名证书以及CA根证书
- 1.5 生成服务端信任库并导入CA根数据
- 1.6 生成客户端信任库并导入CA根证书
- 2 配置zookeeper SASL认证
- 2.1 编写zk_server_jass.conf配置
- 2.2 修改zk启动脚本
- 2.3 修改zoo.cfg 配置文件
- 2.4 zk添加jar包
- 2.5 启动zk验证服务
- 3 配置kafka server端
- 3.1 编写kafka_server_jaas.conf
- 3.2 修改kafka启动脚本
- 3.3 修改server.properties
- 3.4 启动kafka
- 4 配置kafka client 端
- 5 验证
- 6. 常见问题
官方资料
https://kafka.apache.org/documentation/#security

概述
Kafka的SASL-SSL配置主要用于保护集群的网络传输安全,确保客户端与服务器端的通信通过加密和认证机制来保证数据的安全性和访问控制.。
Kafka支持多种安全协议,最常见的包括SSL(加密传输)、SASL(认证)和ACL(访问控制列表)。配置SASL-SSL组合可以实现:
- SSL(Secure Sockets Layer):为数据传输提供加密,防止传输过程中的数据泄露和篡改。
- SASL(Simple Authentication and Security Layer):提供身份认证机制。通过配置不同的SASL机制(如PLAIN、SCRAM-SHA-256等),限制只有经过认证的用户才可以访问Kafka。
制作kakfa证书
1.1 openssl 生成CA
openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
openssl-ca.cnf内容如下
HOME = .
RANDFILE = $ENV::HOME/.rnd####################################################################
[ ca ]
default_ca = CA_default # 默认的 ca 部分[ CA_default ]
base_dir = . # 基本目录
certificate = $base_dir/ca/cacert.pem # CA 证书
private_key = $base_dir/ca/cakey.pem # CA 私钥
new_certs_dir = $base_dir # 签名后的新证书位置
database = $base_dir/index/index.txt # 数据库索引文件
serial = $base_dir/serial/serial.txt # 当前序列号default_days = 1000 # 证书有效期
default_crl_days = 30 # 下一个 CRL 之前的有效期
default_md = sha256 # 使用的公钥摘要算法,默认为 sha256
preserve = no # 不保留传递的 DN 排序x509_extensions = ca_extensions # 添加到证书的扩展email_in_dn = no # 在 DN 中不包含电子邮件
copy_extensions = copy # 从 CSR 复制 SAN 到证书####################################################################
[ req ]
default_bits = 4096 # 默认密钥位数
default_keyfile = cakey.pem # 默认密钥文件
distinguished_name = ca_distinguished_name # 默认的区分名
x509_extensions = ca_extensions # 默认的 X.509 扩展
string_mask = utf8only # 字符串掩码####################################################################
[ ca_distinguished_name ]
countryName = Country Name (2 letter code) # 国家/地区名(两个字母代码)
countryName_default = CN # 默认国家/地区stateOrProvinceName = State or Province Name (full name) # 州/省名(全名)
stateOrProvinceName_default = SD # 默认州/省名localityName = Locality Name (eg, city) # 地区/城市名
localityName_default = JN # 默认地区/城市名organizationName = Organization Name (eg, company) # 组织名
organizationName_default = UNKNOWN # 默认组织名organizationalUnitName = Organizational Unit (eg, division) # 组织单位名
organizationalUnitName_default = UNKNOWN # 默认组织单位名commonName = Common Name (e.g. server FQDN or YOUR name) # 通用名(例如服务器 FQDN 或您的姓名)
commonName_default = HUC # 默认通用名emailAddress = Email Address # 电子邮件地址
emailAddress_default = test@test.com # 默认电子邮件地址####################################################################
[ ca_extensions ]
subjectKeyIdentifier = hash # 主题密钥标识符
authorityKeyIdentifier = keyid:always, issuer # 授权密钥标识符
basicConstraints = critical, CA:true # 基本约束
keyUsage = keyCertSign, cRLSign # 密钥用途####################################################################
[ signing_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional####################################################################
[ signing_req ]
subjectKeyIdentifier = hash # 主题密钥标识符
authorityKeyIdentifier = keyid,issuer # 授权密钥标识符
basicConstraints = CA:FALSE # 基本约束
keyUsage = digitalSignature, keyEncipherment # 密钥用途
1.2 生成server端秘钥对以及证书仓库
keytool -genkeypair -keystore serverkeystore.jks -alias KafkaKeyStore -validity 3650 -keyalg RSA -storetype pkcs12
1.3 CA 签名证书
利用服务端秘钥库生成证书请求:
keytool -keystore serverkeystore.jks -alias Kafkakeystore -certreq -file cert-file.csr
CA签名生成签名证书:
openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out kafka-cert-signed.cert -days 3650 -infiles ../cert-file.csr
1.4 服务端秘钥库导入签名证书以及CA根证书
keytool -keystore serverkeystore.jks -alias Kafkakeystore -import -file kafka-cert-signed.cert
keytool -keystore serverkeystore.jks -alias CARoot -import -file ./ca/ca/cacert.pem
1.5 生成服务端信任库并导入CA根数据
keytool -keystore server_truststor.jks -alias CARoot -import -file ./ca/cacert.pem
1.6 生成客户端信任库并导入CA根证书
keytool -keystore client_truststor.jks -alias CARoot -import -file ./ca/cacert.pem
2 配置zookeeper SASL认证
2.1 编写zk_server_jass.conf配置
文件信息如下
Server {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="zk"password="1qax#EDC5tgb"user_kafka="234BCDefg#";
};
其中username与password为zk集群之前认证的用户名密码,user_kafka=“234BCDefg#” 代表用户为kafka,密码为234BCDefg#,kafka认证的用户名以及密码,kafka中需要配置
2.2 修改zk启动脚本
添加启动参数如下:
-Djava.security.auth.login.config=zk_server_jass.conf
2.3 修改zoo.cfg 配置文件
添加参数如下:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
2.4 zk添加jar包
拷贝kafka lib目录下kafka-clients-2.3.0-SNAPSHOT.jar、lz4-.jar、slf4j-api-.jar、slf4j-log4j12-.jar、snappy-java-.jar 五个jar包到zk的lib目录下
2.5 启动zk验证服务
3 配置kafka server端
3.1 编写kafka_server_jaas.conf
添加jass配置文件,内容如下:
KafkaServer {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="admin"password="234BCDefg#"user_admin="234BCDefg#"user_alice="234BCDefg#";
};
Client {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="kafka"password="234BCDefg#";
};
其中username与password 为kafka集群内部认证的用户名与密码,与user_admin或者其他用户保持一致
user_admin="234BCDefg#"与user_alice="234BCDefg#"配置用户,格式为user_用户名=密码
Client 配置zk认证的用户名与密码,必须与zk中配置的保持一致
3.2 修改kafka启动脚本
添加启动参数如下:
-Djava.security.auth.login.config=kafka_server_jaas.conf
3.3 修改server.properties
修改监听协议
listeners=SASL_SSL://:9093
advertised.listeners=SASL_SSL://10.11.106.63:9093
配置SSL
ssl.keystore.location=./ssl/kakfa-server-keystore.jks
ssl.keystore.password=1qaz#EDC5tgb
ssl.key.password=1qaz#EDC5tgb
ssl.truststore.location=./ssl/server_truststor.jks
ssl.truststore.password=1qaz#EDC5tgb
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.keystore.type=JKS
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=
配置SASL
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
3.4 启动kafka
验证服务是否正常启动
4 配置kafka client 端
客户端添加参数如下:
指定SASL_SSL协议:
security.protocol=SASL_SSL
SASL认证:
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=\"alice\" password=\"234BCDefg#\";
SSL配置:
ssl.truststore.location=./ssl/client_truststor.jks
ssl.truststore.password=1qaz#EDC5tgb
ssl.endpoint.identification.algorithm=
5 验证
命令行执行:
.\kafka-console-producer.bat --broker-list 127.0.0.1:9093 --topic artisanTest
未指定ssl参数,则server端日志中会出现以下异常:
[2024-05-24 10:20:55,334] INFO [SocketServer brokerId=0] Failed authentication with 127.0.0.1/127.0.0.1 (SSL handshake failed) (org.apache.kafka.common.network.Selector)
添加SSL 客户端配置文件 client-ssl.properties,内容如下:
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=\"alice\" password=\"234BCDefg#\";
ssl.truststore.location=./ssl/client_truststor.jks
ssl.truststore.password=1qaz#EDC5tgb
ssl.endpoint.identification.algorithm=
再次执行命令,添加配置参数:
.\kafka-console-producer.bat --broker-list 127.0.0.1:9093 --topic artisanTest --producer.config client-ssl.properties
可正常发送消息
6. 常见问题
- 测试连接:通过Kafka的
console-producer和console-consumer客户端工具测试SASL-SSL的连接是否配置正确。 - SSL握手失败:若未正确配置SSL密钥库或信任库,可能会遇到
SSL handshake failed错误。 - 认证失败:若SASL用户名或密码不匹配,可能会出现
Failed authentication的异常日志。

相关文章:
Kafka - 启用安全通信和认证机制_SSL + SASL
文章目录 官方资料概述制作kakfa证书1.1 openssl 生成CA1.2 生成server端秘钥对以及证书仓库1.3 CA 签名证书1.4 服务端秘钥库导入签名证书以及CA根证书1.5 生成服务端信任库并导入CA根数据1.6 生成客户端信任库并导入CA根证书 2 配置zookeeper SASL认证2.1 编写zk_server_jass…...
c++基础32输入和输出
输入和输出 C风格(使用printf和scanf)输出字符输入字符 C风格(使用cin和cout)输出字符输入字符 注意事项 在C和C中,字符的输入和输出可以通过多种方式实现,包括使用标准输入输出库函数如 printf和 scanf&…...
[C++] 函数详解
前言 今天zty带来的是函数的详解,搞了4个小时,大家给个赞呗,zty还要上学,发作品会少一点 先 赞 后 看 养 成 习 惯 先 赞 后 看 养 成 习 惯 先 赞 后 看 养 成 习 惯 演示用编译器及其…...
AMD CPU下pytorch 多GPU运行卡死和死锁解决
参考链接 https://medium.com/amitparekh/solving-ddp-deadlock-with-multiple-gpus-and-amd-cpus-442186632034 简要说明 AMD的IOMMU和NVIDIA的NCCL不兼容问题导致AMD的IOMMU是BIOS 级组件,它基本上充当将虚拟地址映射到 GPU 上的物理地址的接口,它的全部目的是让 CPU 和 G…...
Swift 开发教程系列 - 第12章:协议与协议扩展
协议(Protocol)是 Swift 的一种重要特性,它定义了实现特定功能的方法、属性或其他要求。通过协议,可以将行为定义从具体实现中分离,使代码更具可读性和扩展性。Swift 的协议支持协议扩展,这一特性允许我们为…...
麒麟V10,arm64,离线安装docker和docker-compose
文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…...
NUXT3学习日记二(样式配置、引入组件库、区分在服务端还是在客户端渲染)
上一章已经给大家分享官网下载的nuxt3了,下面正式进入我所要说的内容吧 一、初始化样式 想必大家从我的git下载下来的nuxt3,能看到nuxt.config.ts这个文件了吧。 这里我们有两种css配置方式 1、css:[~/assets/base.scss] 这种方式不能在scss文件中定义…...
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
基本概念 RTL(Register - Transfer - Level)视图:是一种硬件描述语言的抽象层次,用于描述数字电路中寄存器之间的数据传输和操作。在这个层次上,可以看到电路的基本结构,如寄存器、组合逻辑、多路复用器等…...
Javascript高级—闭包问题
闭包问题 循环中赋值为引用的问题 for (var i 1; i < 5; i) {setTimeout(function timer() {console.log(i)}, i * 1000) }解决方法有3种 第一种,使用立即执行函数方式 for (var i 1; i < 5; i) {(fuction(j){setTimeout(function timer() {console.log…...
C#入门 017 字段,属性,索引器,常量
字段,属性,索引器,常量都表示数据 字段 什么是字段 字段(field)是一种表示与对象或类型(类与结构体)关联的变量字段是类型的成员,又称“成员变量,写在类体里面与对象关联的字段亦称“实例字段,表示某个对…...
磐石云语音助手拦截介绍
呼叫中心用户实际应用场景下最高会有超过30%的和语音助手;无声主要是进入了语音信箱;如:“听到滴声后留言”,”漏话提醒““发送请按1,重录请按2”以及拨打过程中客户主动拒接产生的”您拨打的用户正忙“,”关机“”停…...
JSP执行过程及其与Servlet执行效率的比较
JSP(Java Server Pages)和Servlet都是Java Web开发中常用的技术,它们都用于动态生成Web页面。然而,JSP和Servlet在执行过程和效率上存在一些差异。本文将详细探讨JSP的执行过程,并比较JSP与Servlet的执行效率。 一、J…...
open3d
open3d open3d用于 3D 数据处理的现代库。 简介 Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。Open3D 前端公开了一组精心挑选的 C 和 Python 数据结构和算法。后端经过高度优化,并设置为并行化。Open3D 是从零开始开发的,具有一更…...
Vue中优雅的使用Echarts的三种方式
一、原始方法直接使用 1、安装ECharts: npm install echarts --save 2、创建一个Vue公共组件 EChart.vue: <template><div :style"{width: 100%, height: 300px}" ref"chart"></div> </template><scri…...
SpringBoot配置文件/日志
目录 一,SpringBoot配置文件 1,配置文件的格式: 2,properties 3,yml 1,properties与yml的转换 2,读取配置选哪个中的内容 3,单双引号的差异: 4,配置对象: 5,配置集合/配置map 6,yml的优缺点: 二,验证码: 学习目的: 实现样例: 接口定义: 代码总结: 三,日志: 1,概…...
微服务架构面试内容整理-SpringCloud Netflix与Spring Cloud Alibaba比较
Spring Cloud Netflix 和 Spring Cloud Alibaba 都是用于构建微服务架构的解决方案,但它们在设计理念、组件和使用场景上存在一些差异。以下是它们的比较: 1. 服务注册与发现 ● Spring Cloud Netflix:使用 Eureka 作为服务注册和发现的组件。Eureka 是基于 REST 的,适合服…...
JDBC魔法:连接MySQL数据库与数据操作的秘籍
文章目录 一. JDBC介绍二. 数据库驱动1.DriverManager2.Connection3.PreparedStatement4.ResultSet 三. JDBC连接MySQL1. 加载驱动2. 获得连接3. 关闭连接 四. JDBC实现数据新增五. JDBC实现数据删除 一. JDBC介绍 JDBC(Java Database Connectivity)是Ja…...
深入了解Scratch:引导初学者开启编程之旅
引言 在当今数字化时代,编程已不再是成年人的专利,而是一项逐渐向低年龄段普及的技能。Scratch作为一款面向儿童和青少年的图形化编程语言,以其简单易用且充满趣味性的特点,成为了许多初学者学习编程的首选工具。本文将深入探讨S…...
js复制内容到剪切板
复制内容到剪切板 最近预报一个需求需要点击按钮复制当前到行的内容到剪切板, 所以写了这个工具 export function copyText(text: string, prompt: string | null 已成功复制到剪切板!) {if (navigator.clipboard) {return navigator.clipboard.writeText(text).th…...
代码 RNN原理及手写复现
29、PyTorch RNN的原理及其手写复现_哔哩哔哩_bilibili 笔记连接: https://pan.baidu.com/s/1_Sm7ptEiJtTTq3vQWgOTNg?pwd2rei 提取码: 2rei import torch import torch.nn as nn bs,T2,3 # 批大小,输入序列长度 input_size,hidden_size 2,3 # 输入特征大小&a…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...
