生成SSL证书并对Kafka配置SSL认证

1. 生成相关SSL证书

相关知识点:

  • JavaSSL认证: SSL(Secure Socket Layer安全套接层),及其继任者传输安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL再传输层对网络连接进行安全加密。
  • ** Kerberos认证+ACL鉴权:** Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。ACL则是在Kerberos的基础上进行鉴权措施,一般Kerberos认证就够使用了。

1.1 服务器端SSL证书签发

1.1.1 修改/etc/hosts文件,自定义一个hosts名
在这里插入图片描述
1.1.2 创建目录保存证书,以方便证书的保存管理

 mkdir -p /usr/ca/{root,server,client,trust}

注:这4个目录分别用来存放根证书、服务端证书、客户端证书、受信任的证书

1.1.3 生成server.keystore.jks文件(即:生成服务端的keystore文件)

keytool -keystore /usr/ca/server/server.keystore.jks -alias ds-name-27 -validity 365 -genkey -keypass 123456 -keyalg RSA -dname "CN=kafka-single,OU=aspire,O=aspire,L=beijing,S=beijing,C=cn" -storepass 123456 -ext SAN=DNS:name-27

提示:此命令中的密码自定义,主机名改成第一步中配置的主机名

** keytool相关指令说明:**

指令含义
-alias别名
-keystore指定密钥库的名称(就像数据库一样的证书库,可以有很多证书,cacerts这个文件是jre自带的,也可以用其他文件名,如果没有这样的文件名,他会创建这样一个)
-storepass指定密钥库的密码
-keypass指定别名条目的密码
-list显示密钥库中的证书信息
-v显示密钥库中的证书详细信息
-export将别名指定的证书导出到文件
-file参数指定导出到文件的文件名
-delete删除密钥库中的某条目
-import将已签名的数据证书导入密钥库
-keypasswd修改密钥库中指定条目口令
-dname指定证书拥有者信息,其中:CN=名字与姓氏/域名,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两个字母国家代码
-keyalg指定密钥的算法
-validity指定创建证书的有效期是多少天
-keysize:指定密钥长度

1.1.4 生成CA认证证书

目的:为了保证整个证书的安全性,使用CA进行证书的签名保证

openssl x509 -req -CA /usr/ca/root/ca-cert -CAkey /usr/ca/root/ca-key -in /usr/ca/server/server.cert-file -out /usr/ca/server/server.cert-signed -days 365 -CAcreateserial -passin pass:123456

1.1.5 通过CA证书创建一个客户端信任证书

keytool -keystore /usr/ca/trust/client.truststore.jks -alias CARoot -import -file /usr/ca/root/ca-cert -storepass 123456

注1:有了信任证书才可以进行证书有效性检查
注2:以后的证书必须要通过CA认证后才可以使用

1.1.6 通过CA认证书创建一个服务器端信任证书

keytool -keystore /usr/ca/trust/server.truststore.jks -alias CARoot -import -file /usr/ca/root/ca-cert -storepass ds1994

1.1.6 服务器证书的签名处理:
1.1.6.1 导出服务器端证书server-cert-file:

keytool -keystore /usr/ca/server/server.keystore.jks -alias ds-name-27 -certreq -file /usr/ca/server/server.cert-file -storepass 123456

1.1.6.2 用CA给服务器端证书进行签名处理:

openssl x509 -req -CA /usr/ca/root/ca-cert -CAkey /usr/ca/root/ca-key -in /usr/ca/server/server.cert-file -out /usr/ca/server/server.cert-signed -days 365 -CAcreateserial -passin pass:123456

1.1.6.3 将CA证书导入到服务器端keystore

keytool -keystore /usr/ca/server/server.keystore.jks -alias CARoot -import -file /usr/ca/root/ca-cert -storepass 123456

1.1.6.4 将已签名的服务器证书导入到服务器keystore

 keytool -keystore /usr/ca/server/server.keystore.jks -alias ds-name-27 -import -file /usr/ca/server/server.cert-signed -storepass 123456

到此步骤为止,就可以进行"Kafka配置SSL认证"环节了,也可以为了以后方便,提前将客户端的证书生成出来。具体步骤参考:https://blog.csdn.net/justry_deng/article/details/88383081

2. Kafka配置SSL认证

2.1 修改Kafka安装目录config目录下的server.properties文件

############################# Server Basics #############################
# The id of the broker. This must be set to a unique integer for each broker.

listeners=SSL://name-27:9095
advertised.listeners=SSL://name-27:9095
ssl.keystore.location=/usr/ca/server/server.keystore.jks
ssl.keystore.password=123456
ssl.key.password=123456
ssl.truststore.location=/usr/ca/trust/server.truststore.jks
ssl.truststore.password=123456
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.keystore.type=JKS 
ssl.truststore.type=JKS 
ssl.endpoint.identification.algorithm=
security.inter.broker.protocol=SSL
broker.id=0
#port=9092
hostname=name-27
#listeners=PLAINTEXT://name-27:9092
delete.topic.enable=true
############################# Socket Server Settings #############################
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
############################# Log Basics #############################
log.dirs=/usr/data/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
############################# Internal Topic Settings  #############################
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
############################# Log Retention Policy #############################
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
############################# Group Coordinator Settings #############################
group.initial.rebalance.delay.ms=0

注:SSL配置最好写在配置文件的最上面,否则可能导致Kafka配置SSL失败
重要说明:ssl.endpoint.identification.algorithm
一开始我设置ssl.endpoint.identification.algorithm=https,此项设置为https访问,防范攻击,算是加固HTTP访问。但是我使用该项配置后一直报错:

Exception in thread "main" org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
。。。
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
。。。
Caused by: java.security.cert.CertificateException: No subject alternative names present

修改成空字符串后(即可使用原先的访问方式)能正常使用。。。我具体也不知道怎么配置区分开Https访问和原始访问方式,欢迎大家补充

2.2(可选)
如果配置SSL之前,存在Kafka数据,那么建议重新换一个位置来存放数据;如果确保之前的数据已经没什么用了,也可以直接删除之前的数据。
注:之所以是这个文件夹,是因为是我们在安装kafka的时候指定的数据目录,可 详见https://blog.csdn.net/justry_deng/article/details/88381595。

2.3 重启kafka

# 后台启动zookeeper
/var/local/kafka/bin/zookeeper-server-start.sh /var/local/kafka/config/zookeeper.properties > /usr/data/zookeeper.log 2>&1 &
# 前台启动kafak
/var/local/kafka/bin/kafka-server-start.sh /var/local/kafka/config/server.properties

注:启动kafka时最好使用进程独占一个shell的方式前台启动,这样能非常直观的查看启动kafka是否成功。

2.4 使用Linux自带的openssl测试一下,验证配置的SSL是否有效

openssl s_client -debug -connect name-27:9095 -tls1

弹出以下内容说明成功了:
在这里插入图片描述
在这里插入图片描述

3. 使用Kafka测试

3.1 先用常规的命令消费Kafka中的数据

/usr/kafka/kafka_2.12-2.2.1/bin/kafka-console-consumer.sh --bootstrap-server name-27:9095 --topic test --from-beginning

在这里插入图片描述
一直阻塞,但一直消费不到数据。是因为未通过SSL验证

3.2 创建一个SSL下的消费者的配置文件

security.protocol=SSL
ssl.endpoint.identification.algorithm=
group.id=test
ssl.truststore.location=/usr/ca/trust/server.truststore.jks
ssl.truststore.password=123456
ssl.keystore.password=123456
ssl.keystore.location=/usr/ca/server/server.keystore.jks

3.2 再次消费数据时使用改配置文件

/usr/kafka/kafka_2.12-2.2.1/bin/kafka-console-consumer.sh --bootstrap-server name-27:9095 --topic test --from-beginning --consumer.config /usr/kafka/kafka_2.12-2.2.1/config/song_consumer.properties

在这里插入图片描述
可以正常消费数据!

3.3 kafka生产者同样,需要创建SSL配置文件才可以往Topic中生产数据。
配置文件如:
在这里插入图片描述
生产命令如:

/usr/kafka/kafka_2.12-2.2.1/bin/kafka-console-producer.sh --broker-list 192.168.251.27:9095 --topic test --producer.config /usr/kafka/kafka_2.12-2.2.1/config/song_consumer.properties

至此,Kafka已完成SSL的配置。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值