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…...

企业官网的在线客服,如何提高效果?
企业官网的在线客服,如何提高效果? 作者:开源呼叫中心系统 FreeIPCC,github地址:https://github.com/lihaiya/freeipcc 提高企业官网在线客服的效果,是提升客户体验、增强客户满意度和忠诚度的关键。一个…...

「实战应用」如何可视化 DHTMLX Scheduler 中的资源工作量?
DHTMLX Scheduler是一个全面的 UI 组件,用于处理面向业务的 Web 应用程序中复杂的调度和任务管理需求。但是,某些场景可能需要自定义解决方案。例如,如果项目的资源(即劳动力)有限,则需要确保以更高的精度分…...

论文阅读《BEVFormer》
BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers 目录 摘要1 介绍2 相关工作2.1 基于Transformer的2D感知 摘要 3D视觉感知任务对于自动驾驶系统至关重要,包括基于多相机图像的3D检测和地图分割。…...

sql专题 之 sql的执行顺序
文章目录 sql的执行顺序sql语句的格式实际的执行顺序:虚拟表 vs 数据集虚拟表 结果集总结嵌套查询在sql查询中的执行顺序 前文我们了解了sql常用的语句,这次我们对于这些语句来个小思索 戳这里→ sql专题 之 常用命令 sql的执行顺序 SQL语句的执行顺序是…...

Vue3 -- 基于Vue3+TS+Vite项目【项目搭建及初始化】
兼容性注意: Vite 需要 Node.js 版本 18+ 或 20+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。【摘抄自vite官网】 这里我用的node版本是 v18.20.2 创建项目: 创建项目我们可以使用npm、yarn、pnpm、bun …...

CTF-RE: TEA系列解密脚本
// // Created by A5rZ on 2024/10/26. //#ifndef WORK_TEA_H #define WORK_TEA_H#endif //WORK_TEA_H#include <cstdint> #include <cstdio>// 定义TEA加密算法的轮次,一般建议为32轮 #define TEA_ROUNDS 32 #define DELTA 0x9e3779b9// TEA加密函数 v…...

信号量和线程池
1.信号量 POSIX信号量,用与同步操作,达到无冲突的访问共享资源目的,POSIX信号量可以用于线程间同步 初始化信号量 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem:指向sem_t类…...

【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进
文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…...

「QT」几何数据类 之 QPointF 浮点型点类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

可能是全网第一个MySQL Workbench插件编写技巧
引言 应公司要求,数据库的敏感数据在写入到数据库中要进行加密,但是在测试环境查询数据的时候要手动解密,很不方便,有的时候数据比较多,解密比较麻烦。遂研究了一下如何通过 MySQL Workbench 的插件来实现查询数据一键…...