当前位置: 首页 > news >正文

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 安装 以下内容均已完成测试&#xff0c;按照教程搭建你会得到一个双向ssl认证的kafka broker&#xff0c;并能通过ip以及域名访问&#xff0c;笔者能力有限如果文章内容存在问题烦请各位指出。 搭建单机Kafka 需求 centos 7kafka_2.12-2.6.0jdk8&#xff08;文档中统…...

推荐一个.Net Core开发的Websocket群聊、私聊的开源项目

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一个使用Websocket协议实现的、高性能即时聊天组件&#xff0c;可用于群聊、好友聊天、游戏直播等场景。 项目简介 这是一个基于.Net Core开发的、简单、高性能的通讯组件&#xff0c;支持点对点…...

华为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课程中&#xff0c;我先后总结了deepwalk、node2vec&#xff0c;这两种算是最经典也是最主流的做法&#xff0c;而在 图节点嵌入相关算法学习笔记 中&#xff0c;从头至尾&#xff0c;将一些经典算法用wiki的数据集复现了一下&#xff0c;所以本篇博文&#xff0…...

Buuctf Younger-drive 题解

目录 一.查壳 二.运行缺少dll 三.主函数 四.hObject线程 五.Thread线程 六.judge函数 七.解题脚本 这题的关键在于了解一定的线程相关知识 一.查壳 32位带壳,用upx脱壳 二.运行缺少dll 后续尝试了各种方法修复dll但是还是运行不了 值得一提的是脱壳后的程序不能动态调试…...

数据结构与算法:二叉树专题

数据结构与算法&#xff1a;二叉树专题前言前提条件基础知识二叉树链式存储结构二叉树中序遍历二叉树层序遍历常见编程题把一个有序整数数组放到二叉树中逐层打印二叉树结点数据求一棵二叉树的最大子树和判断两棵二叉树是否相等把二叉树转换为双向链表判断一个数组是否是二元查…...

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

《计算机系统基础》—— 运算

文章目录《计算机系统基础》——运算整数按位运算作用操作位移运算作用操作乘法运算除法运算浮点数加减运算乘除运算《计算机系统基础》——运算 &#x1f680;&#x1f680;本章我们需要介绍的是有关C语言里面的运算&#xff0c;当然了&#xff0c;我们不会是介绍简单的运算&…...

MSTP多进程讲解与实验配置

目录 MSTP多进程 专业术语 MSTP多进程配置 在MSTP域配置 MSTP多进程 多进程的作用 将设备上的端口绑定到不同的进程中&#xff0c;以进程为单位进行MSTP计算&#xff0c;不在同一进程内的端口不参与此进程中的MSTP协议计算&#xff0c;实现各个进程之间的生成树计算相互独立…...

【Python】软件测试必备:了解 fixture 在自动化测试中的重要作用

在自动化软件测试中&#xff0c;fixture 是一种确保测试在一致且受控条件下运行的重要方法。简单来说&#xff0c;fixture 就是一组先决条件或固定状态&#xff0c;必须在运行一组测试之前建立。在测试框架中&#xff0c;fixture 提供了一种方便的方法&#xff0c;用于在每个测…...

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 区分纳米颗粒核壳原子

声明&#xff1a;未经允许&#xff0c;不得擅自复制、转载。欢迎引用&#xff1a;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、设备管理基础知识 &#xff08;1&#xff09;、外部设备分类 &#xff08;2&#xff09;、注意事项 2、I/O硬件原理 &#xff08;1&#xff09;、不同方式对I/O设备分类 &#xff08;2&#xff09;、I/O控制方式 &#xff08;3&#xff09;、设备控制器 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知识点总结&#xff1a;想看的可以从这里进入 目录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反向代理是一种常用的反向代理技术&#xff0c;它允许您将一个或多个Web服务器上的内容公开给Internet上的客户端&#xff0c;而不必暴露您的服务器的IP地址。Nginx反向代理的原理是&#xff1a;客户端发出一个HTTP请求&#xff0c;Nginx服务器收到请求后&#xff0c;将请…...

Happen-Before从入门到踹门

什么是Happen-Before有人翻译为"先行发生原则"&#xff0c;其实也没错&#xff0c;但是更准确的说法应该是&#xff0c;前一个操作的值&#xff0c;后一个总能察觉到。Happen-Before的八条规则程序有序性&#xff1a;在前面的代码优先于在后面的代码执行volatile的变…...

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...