为了保证数据的保密性,希望可以在数据交互的过程中加密数据,而使用 SSL 协议就可以满足对应的要求。
配置 SSL 协议
创建证书
产生证书的脚本可参考:
https://github.com/confluentinc/librdkafka/blob/master/tests/gen-ssl-certs.sh
修改脚本密码 为 123456
# Password
PASS='123456'
- 先产生对应的根证书
gen-ssl-certs.sh ca ca-cert kafka
- 然后产生服务器端的签名证书和 jks 信任库
gen-ssl-certs.sh -k server ca-cert kafka. kafka
得到的文件如下所示:
- 接着产生客户端的 jks 信任库
gen-ssl-certs.sh -k client ca-cert kafka. kafka
得到的文件如下所示:
- 最后产生 客户端的 -des3 的证书
gen-ssl-certs.sh client ca-cert kafka. kafka
得到的文件如下所示:
配置
- 修改文件地址:
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=
- 修改文件地址:
/etc/hosts
127.0.0.1 kafka
重启 kafka
./bin/kafka-server-start.sh config/server.properties
不同场景下的配置
主要是加上 SSL 相关配置
kafka 脚本测试
- 添加文件地址:
bin/client_security.properties
security.protocol=SSL
ssl.truststore.location=${kafkaPath}/kafka.client.truststore.jks
ssl.truststore.password=123456
- 执行 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包测试
- 需要的参数
| 参数 | 内容 |
|---|---|
| bootstrap.servers | kafka:9094 |
| security.protocol | SSL |
| ssl.truststore.location | kafka.client.truststore.jks 文件地址 |
| ssl.truststore.password | 123456 |
- 添加对应的 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>
- 编写生产者或者消费者代码测试
使用 librdkafka 包测试
需要的参数
| 参数 | 内容 |
|---|---|
| bootstrap.servers | 127.0.0.1:9094 |
| security.protocol | SSL |
| enable.ssl.certificate.verification | 如果为 false 表示客户端不会对服务器进行认证,则不需要下面的 ssl 相关配置 |
| ssl.ca.location | ca-cert 文件地址 |
| ssl.certificate.location | kafka.client.pem 文件 |
| ssl.key.password | 123456 |
问题
其实从参数可以看出,使用 librdkafka 包时,bootstrap.servers 中的 host 配置可以直接是 ip , 而 使用 kafka 包和脚本测试时,对应的 host 配置是 kafka, 这是 librdkafka 做了什么处理呢?