kafka 构建双向SSL认证
kafka 安装
以下内容均已完成测试,按照教程搭建你会得到一个双向ssl认证的kafka broker,并能通过ip以及域名访问,笔者能力有限如果文章内容存在问题烦请各位指出。
搭建单机Kafka
需求
- centos 7
- kafka_2.12-2.6.0
- jdk8+(文档中统一使用jdk1.8.0_202)
安装
参考文档
安装路径:/opt/kafka_2.12-2.6.0
步骤1:获取Kafka
wget https://archive.apache.org/dist/kafka/2.6.0/kafka-2.6.0-src.tgz
tar -xzf kafka_2.12-2.6.0.tgz
cd kafka_2.12-2.6.0
步骤2:启动kafka环境
# 启动zookeeper 服务
bin/zookeeper-server-start.sh config/zookeeper.properties
# 启动kafka broker 服务
bin/kafka-server-start.sh config/server.properties
# 创建topic,用于后续测试
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
至此kafka 已经安装并启动成功,以下围绕service.properties配置双向ssl展开
签发双向SSL
需求
- keytool jdk8+(文档中统一使用jdk1.8.0_202)
- openssl 1.0.2k-fips
参考文档
kafka官方文档
kafka官方文档-译文
keytool官方文档
openssl官方文档
实现步骤
注🚩:
- COMMON NAME😅: 配置keystore时的cn选项表示COMMON NAME,客户端就会校验证书的【COMMON NAME】与机器的”域名“,如下方-dname "cn=mykafkassl.com,ou=xxx"中,主机名设置为了 mykafkassl.com,那么在建立ssl连接就应该使用SSL://mykafkassl.com:<port>,如果直接使用ip会提示主机名校验失败或者握手失败的错误。
- SAN(更好的方式)😁: COMMON NAME的局限性很明显,只能使用单个域名,无法给多个域名以及IP签名,针对此种情况可以配置SAN(Subject Alternative Name)解决。自从SAN引入以来,使用COMMON NAME就变得比不那么可取,尽管它还可以用。
步骤1: 构造keystore
构造密钥目录
mkdir /var/private/ssl -p
cd /var/private/ssl
-dname 选项请按照实际情况修改,应十分注意cn的内容,这会直接影响证书是否可用
-validity 为有效期
-keyalg 表示选项指定生成密钥对或私钥时使用的算法,默认为DSA,使用默认选项会出现jks转成pem私钥解析失败的问题
keytool -genkey -dname "cn=mykafkassl.com, ou=qihoo, o=qihoo, c=CN" -keystore server.keystore.jks -alias localhost -validity 36500 -storetype PKCS12 -keypass <your password> -storepass <your password> -keyalg RSAkeytool -genkey -dname "cn=mykafkassl.com, ou=qihoo, o=qihoo, c=CN" -keystore client.keystore.jks -alias localhost -validity 36500 -storetype PKCS12 -keypass <your password> -storepass <your password> -keyalg RSA
步骤2: 生成CA签发机构
生成CA的私钥、CA的证书
提示内容请根据实际情况填写,COMMON NAME 部分建议与步骤一保持一致
-days选项表示有效期
openssl req -new -x509 -keyout ca-key -out ca-cert -days 36500
步骤3: 使用CA给证书签名
导出证书以便于后续签名
# server
keytool -keystore server.keystore.jks -alias localhost -certreq -file server.crt -keypass <your password> -storepass <your password># client
keytool -keystore client.keystore.jks -alias localhost -certreq -file client.crt -keypass <your password> -storepass <your password>
使用步骤2生成的CA给刚导出的证书签名
openssl.cnf 用于构造SAN,需要根据实际情况修改[alt_names]
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = MN
localityName = Locality Name (eg, city)
localityName_default = Minneapolis
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = Domain Control Validated
commonName = Internet Widgits Ltd
commonName_max = 64[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names[alt_names]
DNS.1 = mykafkassl.com
IP.1 = <your ip address>
将openssl.cnf 拷贝到服务器上
# server
openssl x509 -req -CA ca-cert -CAkey ca-key -in server.crt -out server-crt.signed -days 36500 -CAcreateserial -extfile openssl.cnf -extensions v3_req# client
openssl x509 -req -CA ca-cert -CAkey ca-key -in client.crt -out client-crt.signed -days 36500 -CAcreateserial -extfile openssl.cnf -extensions v3_req
步骤4: 将签名后的证书和CA证书导入到keystore
# server
keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert -keypass <your password> -storepass <your password>
keytool -keystore server.keystore.jks -alias localhost -import -file server-crt.signed -keypass <your password> -storepass <your password># client
keytool -keystore client.keystore.jks -alias CARoot -import -file ca-cert -keypass <your password> -storepass <your password>
keytool -keystore client.keystore.jks -alias localhost -import -file client-crt.signed -keypass <your password> -storepass <your password>
步骤5:构造信任库
# server
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert -keypass <your password> -storepass <your password># client
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert -keypass <your password> -storepass <your password>
步骤6:配置server.properties
vim /opt/kafka_2.12-2.6.0/config/server.properties
security.inter.broker.protocol=SSLlisteners=SSL://0.0.0.0:9093advertised.listeners=SSL://<your ip address>:9093ssl.keystore.location=/var/private/ssl/server.keystore.jks
ssl.keystore.password=Q!hooS0c
ssl.key.password=Q!hooS0cssl.truststore.location=/var/private/ssl/server.truststore.jks
ssl.truststore.password=Q!hooS0c
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1ssl.client.auth=required
ssl.endpoint.identification.algorithm=
步骤7:配置客户端测试
生成client-ssl.properties客户端配置
vim /opt/kafka_2.12-2.6.0/config/client-ssl.properties
client-ssl.properties
security.protocol=SSL
ssl.truststore.location=/var/private/ssl/client.truststore.jks
ssl.truststore.password=Q!hooS0cssl.keystore.location=/var/private/ssl/client.keystore.jks
ssl.keystore.password=Q!hooS0c
ssl.key.password=Q!hooS0c
启动客户端,并输入一些测试数据,如果没有报错则表明ssl配置成功
bin/kafka-console-producer.sh --broker-list <your ip address>:9093 --topic quickstart-events --producer.config config/client-ssl.properties
bin/kafka-console-consumer.sh --bootstrap-server <your ip address>:9093 --topic quickstart-events --consumer.config config/client-ssl.properties
ssl 的鉴权原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NTsx9w4K-1677863718067)(/uploads/58fcebe11ae36ec898636069d3ef180e/image.png)]
常见问题
问题1:配置ssl 不生效
kafka broker配置了PLAINTEXT和SSL两个端口,客户端通过PLAINTEXT连接没有经过SSL
问题2:使用官方文档的方式验证ssl配置出现error字样
由于是自签名,这种情况属正常现象
问题3:客户端携带证书的tcp请求(消费请求)会提示请求数据过大(默认100m)
请不要盲目参考网络上教程提高max_size,应该仔细检查server.properties 配置
问题4:ssl握手失败
在步骤1中的域名配置错误,在客户端校验时发现主机名与证书的COMMON NAME不一致,故断开连接。
当然 握手失败的的原因远远不止这一种,推荐使用抓包工具(如wireshark、tcpdump)抓包排查握手失败发生在哪一步从而确定错误原因、使用openssl自带的s_client、s_server并开启debug模式,定位错误原因。
问题5:我只有一个ip,没有域名应该怎么签
common name可以配置成一个虚拟的域名,然后再客户端和服务器中修改hosts。也可以配置SAN,在扩展项中输入ip
相关文章:
kafka 构建双向SSL认证
kafka 安装 以下内容均已完成测试,按照教程搭建你会得到一个双向ssl认证的kafka broker,并能通过ip以及域名访问,笔者能力有限如果文章内容存在问题烦请各位指出。 搭建单机Kafka 需求 centos 7kafka_2.12-2.6.0jdk8(文档中统…...
推荐一个.Net Core开发的Websocket群聊、私聊的开源项目
更多开源项目请查看:一个专注推荐.Net开源项目的榜单 今天给大家推荐一个使用Websocket协议实现的、高性能即时聊天组件,可用于群聊、好友聊天、游戏直播等场景。 项目简介 这是一个基于.Net Core开发的、简单、高性能的通讯组件,支持点对点…...
华为OD机试Golang解题 - 事件推送 | 含思路
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...
将微信小程序页面转为图片
最近做项目遇到一个需求,那就是要将某个页面转为图片然后传给后端,我仔细找了一圈,发现官方那个Api也就是wx.canvasToTempFilePath生成的图片很有可能为空,太坑了,于是我放弃用它了,选择了用wxml2canvas。 安装wxml2canvas npm init npm install wxml2canvas --save --…...
LINE、SDNE和struc2vec图嵌入算法学习笔记
引言 在cs224w课程中,我先后总结了deepwalk、node2vec,这两种算是最经典也是最主流的做法,而在 图节点嵌入相关算法学习笔记 中,从头至尾,将一些经典算法用wiki的数据集复现了一下,所以本篇博文࿰…...
Buuctf Younger-drive 题解
目录 一.查壳 二.运行缺少dll 三.主函数 四.hObject线程 五.Thread线程 六.judge函数 七.解题脚本 这题的关键在于了解一定的线程相关知识 一.查壳 32位带壳,用upx脱壳 二.运行缺少dll 后续尝试了各种方法修复dll但是还是运行不了 值得一提的是脱壳后的程序不能动态调试…...
数据结构与算法:二叉树专题
数据结构与算法:二叉树专题前言前提条件基础知识二叉树链式存储结构二叉树中序遍历二叉树层序遍历常见编程题把一个有序整数数组放到二叉树中逐层打印二叉树结点数据求一棵二叉树的最大子树和判断两棵二叉树是否相等把二叉树转换为双向链表判断一个数组是否是二元查…...
Cadence Allegro 导出Cadence Schematic Feedback Report详解
⏪《上一篇》 🏡《总目录》 ⏩《下一篇》 目录 1,概述2,Cadence Schematic Feedback Report作用3,Cadence Schematic Feedback Report示例4,Cadence Schematic Feedback Report导出方法4.1,方法1,4.2,方法2,...
《计算机系统基础》—— 运算
文章目录《计算机系统基础》——运算整数按位运算作用操作位移运算作用操作乘法运算除法运算浮点数加减运算乘除运算《计算机系统基础》——运算 🚀🚀本章我们需要介绍的是有关C语言里面的运算,当然了,我们不会是介绍简单的运算&…...
MSTP多进程讲解与实验配置
目录 MSTP多进程 专业术语 MSTP多进程配置 在MSTP域配置 MSTP多进程 多进程的作用 将设备上的端口绑定到不同的进程中,以进程为单位进行MSTP计算,不在同一进程内的端口不参与此进程中的MSTP协议计算,实现各个进程之间的生成树计算相互独立…...
【Python】软件测试必备:了解 fixture 在自动化测试中的重要作用
在自动化软件测试中,fixture 是一种确保测试在一致且受控条件下运行的重要方法。简单来说,fixture 就是一组先决条件或固定状态,必须在运行一组测试之前建立。在测试框架中,fixture 提供了一种方便的方法,用于在每个测…...
DevExpress皮肤引用的办法
1.引用Dll皮肤文件Typeprocedure SetSkin(skinnam:string);procedure TFrmMain.SetSkin(skinnam:string);varHinst:THANDLE;RStream:TResourceStream;beginHinst:Loadlibrary(ALLSK.dll);If Hinst0 ThenExitelsebeginRstream:TResourceStream.Create(Hinst,skinnam,MYSKIN);dxS…...
2023-03-04 区分纳米颗粒核壳原子
声明:未经允许,不得擅自复制、转载。欢迎引用:Laser-Assisted Synthesis of Bi-Decorated Pt Aerogel for Efficient Methanol Oxidation ElectrocatalysisApplied Surface Science ( IF 6.707 ) Pub Date : 2022-04-01 , DOI: 10.1016/j.aps…...
review设备管理
目录 1、设备管理基础知识 (1)、外部设备分类 (2)、注意事项 2、I/O硬件原理 (1)、不同方式对I/O设备分类 (2)、I/O控制方式 (3)、设备控制器 3、I/O软…...
Cadence Allegro 导出Bill of Material Report (Condensed)详解
⏪《上一篇》 🏡《总目录》 ⏩《下一篇》 目录 1,概述2,Bill of Material Report (Condensed)作用3,Bill of Material Report (Condensed)示例4,Bill of Material Report (Condensed)导出方法4.1,方法14.2,方法2,...
B. Sherlock and his girlfriend
Sherlock has a new girlfriend (so unlike him!). Valentines day is coming and he wants to gift her some jewelry. He bought n pieces of jewelry. The i-th piece has price equal to i 1, that is, the prices of the jewelry are 2, 3, 4, ... n 1. Watson…...
Spring SpEL表达式
Java知识点总结:想看的可以从这里进入 目录17、Spring SpEL17.1、简介17.2、配合value使用17.2.1、基本字面值17.2.2、类相关表达式17.2.3、properties17.2.4、T运算符17.2.5、new17.2.6、Elvis运算符17.2.7、运算符17.2、配合XML使用17、Spring SpEL 17.1、简介 S…...
Nginx反向代理原理详解与配置
Nginx反向代理是一种常用的反向代理技术,它允许您将一个或多个Web服务器上的内容公开给Internet上的客户端,而不必暴露您的服务器的IP地址。Nginx反向代理的原理是:客户端发出一个HTTP请求,Nginx服务器收到请求后,将请…...
Happen-Before从入门到踹门
什么是Happen-Before有人翻译为"先行发生原则",其实也没错,但是更准确的说法应该是,前一个操作的值,后一个总能察觉到。Happen-Before的八条规则程序有序性:在前面的代码优先于在后面的代码执行volatile的变…...
电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
