kafka 构建双向SSL认证
创始人
2024-05-28 19:12:33
0

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:,如果直接使用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  -storepass  -keyalg RSAkeytool -genkey -dname "cn=mykafkassl.com, ou=qihoo, o=qihoo, c=CN" -keystore client.keystore.jks -alias localhost -validity 36500 -storetype PKCS12 -keypass  -storepass  -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  -storepass # client
keytool -keystore client.keystore.jks -alias localhost -certreq -file client.crt -keypass  -storepass 

使用步骤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 = 

将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  -storepass 
keytool -keystore server.keystore.jks -alias localhost -import -file server-crt.signed -keypass  -storepass # client
keytool -keystore client.keystore.jks -alias CARoot -import -file ca-cert -keypass  -storepass 
keytool -keystore client.keystore.jks -alias localhost -import -file client-crt.signed -keypass  -storepass 

步骤5:构造信任库

# server
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert -keypass  -storepass # client
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert -keypass  -storepass 

步骤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://: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 :9093 --topic quickstart-events --producer.config config/client-ssl.properties
bin/kafka-console-consumer.sh --bootstrap-server :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

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...