kafka SSL配置随笔

常用命令

sh /data/ddos/kafka/bin/kafka-server-start.sh /data/ddos/kafka/config/server.properties


jps -l

First-Fail

配置ssl证书脚本参考,脚本:ca.sh官方文档

安装步骤:深入理解Kafka:核心设计与实践原理 (朱忠华) (Z-Library).pdf

JAAS

Kafka入门与实践%202017%20(牟大恩):Kafka 安全机制

收发消息测试

是的,Kafka可以在单机模式下运行以进行消息的发送和接收。虽然Kafka设计用于构建分布式、高吞吐量、高可用性的消息系统,但它同样可以在单节点上运行,这对于开发、测试或小规模生产环境来说非常有用。

要在单机模式下运行Kafka,您需要按照以下简化的步骤操作:

  1. 下载并解压 Kafka:首先,您需要从 Apache Kafka的官方网站 下载 Kafka 并解压。

  2. 启动 ZooKeeper 实例:Kafka 使用 ZooKeeper 来管理集群状态和元数据。在单机模式下,您可以使用 Kafka 自带的 ZooKeeper。运行以下命令启动 ZooKeeper:

    bin/zookeeper-server-start.sh config/zookeeper.properties
    
  3. 启动 Kafka 服务器:接下来,启动 Kafka 服务器:

    bin/kafka-server-start.sh config/server.properties
    
  4. 创建一个主题:为了发送和接收消息,您需要创建至少一个主题。使用以下命令创建一个名为 test​​ 的主题:

    bin/kafka-topics.sh --create --partitions 1 --replication-factor 1 --topic test --bootstrap-server localhost:9092
    
  5. 发送消息:使用 Kafka 生产者工具发送消息到您刚创建的主题:

    bin/kafka-console-producer.sh --topic test --bootstrap-server localhost:9092
    
  6. 接收消息:使用 Kafka 消费者工具接收消息:

    bin/kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092
    

通过以上步骤,即使是在单机模式下,您也可以实现 Kafka 的消息发送和接收功能。这种模式适合进行开发和测试。

server.properties问题

循环:握手失败

[2024-03-14 15:37:12,897] ERROR [Controller id=8, targetBrokerId=8] Connection to node 8 (zabbix/192.168.19.54:9092) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)

原因:集群环境的client证书存储库需要载入所有节点的客户端证书

解决方案:服务端证书逐个节点生成,客户端证书需要不断合并。

🥳参考:Kafka并不难学

wiki概述

使用 SSL 协议进行加密和身份验证

Kafka默认禁止SSL 协议作为认证机制,可以手动开启。
安装和配置 SSL 协议的步骤较多,大致步骤如下:
(1)给每台代理节点创建一个临时密钥库;
(2)创建私有证书 CA;
(3)给证书进行签名,其内容包含导出证书和签名、导入 CA 和证书到密钥库;
(4)配置服务端和客户端。 详细实现流程如图所示

SSL基础入门

名次解释

PKI:Public Key Infrastructure 公共密钥加密体系
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书存取库: X.509:定义了证书的结构以及认证协议标准

  • 版本号 序列号 签名 算法 颁发者 有效期限 主体名称

证书类型:

  • 证书授权机构的证书
  • 服务器证书
  • 用户证书

获取证书两种方法:

  1. 自签名的证书: 自已签发自己的公钥
  2. 使用证书授权机构:
  • 生成证书请求(csr)
  • 将证书请求csr发送给CA
  • CA签名颁发证书

HTTPS 协议

就是“HTTP 协议”和“SSL/TLS 协议”的组合。

HTTP over SSL 或 HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输

  1. 客户端发起HTTPS请求

    用户在浏览器里输入一个https网址,然后连接到服务器的443端口

  2. 服务端的配置

    采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自 己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出 提示页面。这套证书其实就是一对公钥和私钥

  3. 传送服务器的证书给客户端

    证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等

  4. 客户端解析验证服务器证书

    这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等 等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一 个随机值。然后用证书中公钥对该随机值进行非对称加密

    1. 客户端将加密信息传送服务器

    这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端 的通信就可以通过这个随机值来进行加密解密了

    1. 服务端解密信息

    服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值

    1. 服务器加密信息并发送信息

    服务器将数据利用随机值进行对称加密,再发送给客户端

    1. 客户端接收并解密信息

    客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容

mg方案

生产证书脚本

#!/bin/bash
#
#********************************************************************
#Author:		wangxiaochun
#QQ: 			29308620
#Date: 			2020-02-29
#FileName:		test.sh
#URL: 			http://www.magedu.com
#Description:		The test script
#Copyright (C): 	2020 All rights reserved
#********************************************************************


#证书存放目录
DIR=/data/ddos/kafka/ca


#每个证书信息
declare -A CERT_INFO
CERT_INFO=([subject0]="/O=heaven/CN=ca.god.com" \
           [keyfile0]="cakey.pem" \
           [crtfile0]="cacert.pem" \
           [key0]=2048 \
           [expire0]=3650 \
           [serial0]=0    \
           [subject1]="/C=CN/ST=hubei/L=wuhan/O=Central.Hospital/CN=master.liwenliang.org" \
           [keyfile1]="master.key" \
           [crtfile1]="master.crt" \
           [key1]=2048 \
           [expire1]=365
           [serial1]=1 \
           [csrfile1]="master.csr" \
           [subject2]="/C=CN/ST=hubei/L=wuhan/O=Central.Hospital/CN=slave.liwenliang.org" \
           [keyfile2]="slave.key" \
           [crtfile2]="slave.crt" \
           [key2]=2048 \
           [expire2]=365 \
           [serial2]=2 \
           [csrfile2]="slave.csr"   )

COLOR="echo -e \\E[1;32m"
END="\\E[0m"

#证书编号最大值
N=`echo ${!CERT_INFO[*]} |grep -o subject|wc -l`

cd $DIR 



for((i=0;i<N;i++));do
    if [ $i -eq 0 ] ;then
        openssl req  -x509 -newkey rsa:${CERT_INFO[key${i}]} -subj ${CERT_INFO[subject${i}]} \
            -set_serial ${CERT_INFO[serial${i}]} -keyout ${CERT_INFO[keyfile${i}]} -nodes \
	    -days ${CERT_INFO[expire${i}]}  -out ${CERT_INFO[crtfile${i}]} &>/dev/null
    
    else 
        openssl req -newkey rsa:${CERT_INFO[key${i}]} -nodes -subj ${CERT_INFO[subject${i}]} \
            -keyout ${CERT_INFO[keyfile${i}]}   -out ${CERT_INFO[csrfile${i}]} &>/dev/null

        openssl x509 -req -in ${CERT_INFO[csrfile${i}]}  -CA ${CERT_INFO[crtfile0]} \
	    -CAkey ${CERT_INFO[keyfile0]}  -set_serial ${CERT_INFO[serial${i}]}  \
	    -days ${CERT_INFO[expire${i}]} -out ${CERT_INFO[crtfile${i}]} &>/dev/null
    fi
    $COLOR"**************************************生成证书信息**************************************"$END
    openssl x509 -in ${CERT_INFO[crtfile${i}]} -noout -subject -dates -serial
    echo 
done
chmod 600 *.key
echo  "证书生成完成"
$COLOR"**************************************生成证书文件如下**************************************"$END
echo "证书存放目录: "$DIR
echo "证书文件列表: "`ls $DIR`

使用上述脚本生成证书之后,为了完成Kafka集群的SSL配置,还需要执行一些关键步骤。以下是配置Kafka集群以使用SSL加密通信所需的主要步骤概览:

1. 准备Keystore和Truststore

  • Keystore:包含服务器的私钥和公钥(证书)。对于Kafka而言,每个broker都需要有其自己的keystore。
  • Truststore:包含信任的证书列表。对于Kafka而言,broker和客户端需要有truststore来验证连接另一端的身份。

2. 配置Kafka Broker

  • 编辑server.properties​​文件:对于每个Kafka broker,你需要配置其server.properties​​文件以启用SSL并指定keystore和truststore的位置和密码。例如:

    listeners=SSL://your.broker.hostname:9093
    security.inter.broker.protocol=SSL
    ssl.keystore.location=/path/to/kafka.server.keystore.jks
    ssl.keystore.password=yourkeystorepassword
    ssl.key.password=yourkeypassword
    ssl.truststore.location=/path/to/kafka.server.truststore.jks
    ssl.truststore.password=yourtruststorepassword
    
  • 重启Kafka服务:更改配置文件后,需要重启Kafka服务以使更改生效。

3. 配置Kafka客户端

  • 客户端配置:确保Kafka客户端(生产者和消费者)也配置了SSL。客户端需要指定truststore的路径和密码以验证服务器证书,如果需要双向认证,则还需要指定keystore的路径和密码。配置可能包括:

    ssl.truststore.location=/path/to/kafka.client.truststore.jks
    ssl.truststore.password=yourtruststorepassword
    # 如果需要客户端认证
    ssl.keystore.location=/path/to/kafka.client.keystore.jks
    ssl.keystore.password=yourkeystorepassword
    ssl.key.password=yourkeypassword
    
  • 应用程序代码:在你的Kafka生产者和消费者的应用程序代码中,确保使用了上述SSL配置。

4. 配置主题和ACL(可选)

  • 如果你的Kafka集群使用了主题和访问控制列表(ACL)进行权限管理,你可能还需要配置这些来适应SSL认证。

5. 测试

  • 验证配置:启动Kafka集群后,使用Kafka的命令行工具(如kafka-console-producer​​和kafka-console-consumer​​)来测试SSL连接。确保测试包括所有生产者和消费者的连接,以验证SSL配置正确且有效。

6. 监控和日志

  • 监控:密切监控Kafka集群和客户端的日志,特别是在初次配置SSL时,以确保没有安全或连接问题。
  • 日志:确保日志记录配置得当,以便在遇到问题时能够进行调试。

通过遵循这些步骤,在确保安全性的同时,您可以成功地在Kafka集群中实现SSL加密通信。需要注意的是,SSL/TLS配置可能会因具体环境而异,例如使用的Kafka版本、JVM版本和操作系统等,因此在实际操作中可能需要进行一些调整。

  • 39
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值