kafka使用ssl加密和认证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka使用ssl加密和认证相关的知识,希望对你有一定的参考价值。

参考技术A

Apache kafka 允许clinet通过SSL连接,SSL默认是不可用的,需手动开启。

主要步骤是:

os: ubuntu 18

java: 1.8.0_275

kafka: 2.7.0

官方的步骤

把上面的步骤拆开来,并解释

生成密钥和证书,可以使用java的keytool来生产。我们将生成密钥到一个临时的密钥库,之后我们可以导出并用CA签名它。

例子

keystore: 密钥仓库存储证书文件。密钥仓库文件包含证书的私钥(保证私钥的安全)。

validity: 证书的有效时间,天

此步骤要注意的是,名与姓(CN)这一项必须输入域名,如 "localhost",切记不可以随意写,我曾尝试使用其他字符串,在后面客户端生成证书认证的时候一直有问题。

客户端将根据以下两个字段之一验证服务器的完全限定域名(FQDN):

这两个字段均有效,但是RFC-2818建议使用SAN。SAN更加的灵活,允许声明多个DNS条目。另一个优点是,出于授权目的,可以将CN设置为更有意义的值。 要添加SAN,需将以下参数 -ext SAN=DNS:FQDN 追加到keytool命令:

完成上面步骤,可使用命令

来验证生成证书的内容

server.keystore.jks 这个文件包含了一对 公私钥 ,和 一个证书 来识别机器。但是,证书是未签名的,这意味着攻击者可以创建一个这样的证书来伪装成任何机器。

生成的CA是一个简单的 公私钥对 和 证书 ,用于签名其他的证书。

例子

将生成的CA添加到 **clients\' truststore(客户的信任库)** ,以便client可以信任这个CA:

ca-cert: CA的证书

例子

客户端的信任库存储所有客户端信任的证书,将证书导入到一个信任仓库也意味着信任由该证书签名的所有证书,正如上面的比喻,信任政府(CA)也意味着信任它颁发的所有护照(证书),此特性称为信任链,在大型的kafka集群上部署SSL时特别有用的。可以用单个CA签名集群中的所有证书,并且所有的机器共享相同的信任仓库,这样所有的机器也可以验证其他的机器了。

用步骤2.2 生成的CA签名 步骤2.1生成的证书。首先导出请求文件:

cert-file: 出口,服务器的未签名证书

然后用CA签名:

例子

最后,你需要导入CA的证书和已签名的证书到密钥仓库:

参数

Kafka Broker支持监听多个端口上的连接,通过 server.properteis 配置,最少监听1个端口,用逗号分隔。

下面是broker端需要的SSL配置,

more config/server.properties

Producer和Consumer的SSL的配置是相同的。

如果broker中不需要client(客户端)验证,那么下面是最小的配置示例:

more client-ssl.properties

如果需要客户端认证,则必须像 步骤2.1 一样创建密钥库,并且还必须配置以下内容:

启动 zookeeper 和 kafka

在不同的Terminal 分别运行下面命令

Terminal1

Terminal2

Terminal3

创建topic

生产和消费topic

官网: http://kafka.apache.org/documentation/#security_ssl

https://www.orchome.com/171

https://www.orchome.com/1959

Java 11 导致 SSL handshake fail https://stackoverflow.com/questions/57601284/java-11-and-12-ssl-sockets-fail-on-a-handshake-failure-error-with-tlsv1-3-enable

生成本机证书时,CN 需要填写 localhost 或者真实的域名,否则客户端连接失败。

以上是关于kafka使用ssl加密和认证的主要内容,如果未能解决你的问题,请参考以下文章

加密之SSL和单双向认证

ssl用哪些加密算法,认证机制

[转帖]nginx配置ssl加密(单/双向认证部分https)

什么是SSL加密,什么是TLS加密

什么叫SSL

Kafka ACL使用实战