大数据|如何让 Kafka 支持 SSL 协议

508 阅读2分钟

为了保证数据的保密性,希望可以在数据交互的过程中加密数据,而使用 SSL 协议就可以满足对应的要求。

配置 SSL 协议

创建证书

产生证书的脚本可参考: https://github.com/confluentinc/librdkafka/blob/master/tests/gen-ssl-certs.sh

修改脚本密码 为 123456

# Password
PASS='123456'
  1. 先产生对应的根证书
gen-ssl-certs.sh ca ca-cert kafka
  1. 然后产生服务器端的签名证书和 jks 信任库
gen-ssl-certs.sh -k server ca-cert kafka. kafka

得到的文件如下所示:

image.png

  1. 接着产生客户端的 jks 信任库
gen-ssl-certs.sh -k client ca-cert kafka. kafka

得到的文件如下所示:

image.png

  1. 最后产生 客户端的 -des3 的证书
gen-ssl-certs.sh client ca-cert kafka. kafka

得到的文件如下所示:

image.png

配置

  1. 修改文件地址:config/server.properties
# 这里添加一个只能本地访问PLAINTEXT协议的 9092 端口,以及外部访问 SSL 协议的 9094 端口
advertised.listeners=PLAINTEXT://127.0.0.1:9092,SSL://kafka:9094
listeners=PLAINTEXT://127.0.0.1:9092,SSL://0.0.0.0:9094
#配置的是 broker 之间使用的协议
security.inter.broker.protocol = PLAINTEXT
ssl.client.auth=none

# 这里的 kafkaPath 对应的是你本地环境的 kafka 放文件的地址
ssl.truststore.location=${kafkaPath}/kafka.server.truststore.jks
ssl.truststore.password=123456
ssl.keystore.location=${kafkaPath}/kafka.server.keystore.jks
ssl.keystore.password=123456
ssl.key.password=123456
ssl.endpoint.identification.algorithm=
  1. 修改文件地址:/etc/hosts
127.0.0.1 kafka

重启 kafka

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

不同场景下的配置

主要是加上 SSL 相关配置

kafka 脚本测试

  1. 添加文件地址:bin/client_security.properties
security.protocol=SSL
ssl.truststore.location=${kafkaPath}/kafka.client.truststore.jks
ssl.truststore.password=123456
  1. 执行 kafka 内置脚本
# producer 使用的 9094 端口, topic 是 test
./bin/kafka-console-producer.sh --broker-list kafka:9094 --topic test --producer.config bin/client_security.properties 
# consumer 使用 9092 端口消费
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
# consumer 可以使用 9094 端口消费
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config bin/client_security.properties 

使用 Java kafka-client包测试

  1. 需要的参数
参数内容
bootstrap.serverskafka:9094
security.protocolSSL
ssl.truststore.locationkafka.client.truststore.jks 文件地址
ssl.truststore.password123456
  1. 添加对应的 maven 依赖包
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.11</artifactId>
    <version>2.0.0</version>
</dependency>
  1. 编写生产者或者消费者代码测试

使用 librdkafka 包测试

需要的参数

参数内容
bootstrap.servers127.0.0.1:9094
security.protocolSSL
enable.ssl.certificate.verification如果为 false 表示客户端不会对服务器进行认证,则不需要下面的 ssl 相关配置
ssl.ca.locationca-cert 文件地址
ssl.certificate.locationkafka.client.pem 文件
ssl.key.password123456

问题

其实从参数可以看出,使用 librdkafka 包时,bootstrap.servers 中的 host 配置可以直接是 ip , 而 使用 kafka 包和脚本测试时,对应的 host 配置是 kafka, 这是 librdkafka 做了什么处理呢?