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…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...