Kafka通讯加密SSL


发布于 2017-06-24 / 33 阅读 / 0 评论 /
kafka允许使用SSL来加密传输的数据和认证信息。默认情况下是不使用SSL的,可在需要时开启SSL。

1.实施方案

下面是自签名ssl证书的可实施方案。

1.1.第一步:创建CA

找一个节点,执行以下命令,创建CA的认证证书。

mkdir -p /data/kafka/sslhub;
cd /data/kafka/sslhub;
openssl req -new -x509 -keyout ca-key -out ca-cert -days 3650

1.2.第二步:制作客户端验证服务端的证书

进入同一个节点,切换到/data/kafka/sslhub目录。执行以下操作

(1)生成server.keystore.jks证书的孵化器。

keytool -genkey -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA  -keysize 2048

(2)从(1)中生成的server.keystore.jks中导出证书,并命名为“server.crt”。

keytool -keystore server.keystore.jks -alias localhost -certreq -file server.crt

按照提示信息输入keystore密码。

(3)使用CA的私钥对server.crt进行签名,并为签名后的证书命名为“server-signed.crt”。

openssl x509 -req -CA ca-cert -CAkey ca-key -in server.crt -out server-signed.crt -days 3650 -CAcreateserial

按照提示信息输入(2)中的PEM密码。

(4)将CA证书和“server-signed.crt”导入密钥仓库。

keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert;
keytool -keystore server.keystore.jks -alias localhost -import -file server-signed.crt;

按照提示信息输入keystore密码。

(5)执行以下命令,使客户端信任服务端证书。

keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert

按照提示信息输入client.truststore.jks的密码。

这里生成的client.truststore.jks和server.keystore.jks证书会被配置到kafka client和kafka broker的配置文件中。

1.3.第三步:制作服务端验证客户端的证书

同样是进入同一个节点,切换到/data/kafka/sslhub目录。执行以下操作

(1)生成client.keystore.jks证书的孵化器。

keytool -genkey -keystore client.keystore.jks -alias localhost -validity 3650 -keyalg RSA -keysize 2048

按照提示信息输入keystore密码。

(2)从(2)中生成的client.keystore.jks中导出证书,并命名为“client.crt”。

keytool -keystore client.keystore.jks -alias localhost -certreq -file client.crt

按照提示信息输入keystore密码。

(3)使用CA的私钥对client.crt进行签名,并为签名后的证书命名为“client-signed.crt”。

openssl x509 -req -CA ca-cert -CAkey ca-key -in client.crt -out client-signed.crt -days 3650 -CAcreateserial

按照提示信息输入(2)中的PEM密码。

(4)将CA证书和“client-signed.crt”导入密钥仓库。

keytool -keystore client.keystore.jks -alias CARoot -import -file ca-cert;
keytool -keystore client.keystore.jks -alias localhost -import -file client-signed.crt;

按照提示信息输入keystore密码。

(5)执行以下命令,使服务端信任客户端证书。

keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert

按照提示信息输入server.truststore.jks的密码。

1.4.第四步:将证书copy到kafka节点。

这里kafka-client用到的证书有:/data/kafka/sslhub/client.truststore.jks和/data/kafka/sslhub/client.keystore.jks。

kafka-broker用到的证书有:/data/kafka/sslhub/server.truststore.jks和/data/kafka/sslhub/server.keystore.jks

将这些证书分别发放到kafka的各个节点即可。

1.5.第五步:服务端配置文件server.properties

修改或添加以下几个参数:

ssl.endpoint.identification.algorithm=
ssl.truststore.location=/data/kafka/sslhub/server.truststore.jks
ssl.truststore.password=
ssl.keystore.location=/data/kafka/sslhub/server.keystore.jks
ssl.keystore.password=
ssl.key.password=

password需要根据生成过程设置的密码进行相应补充。

重启kafka broker即可。

1.6.第六步:客户端配置文件

修改或添加以下几个参数:

ssl.endpoint.identification.algorithm=
ssl.keystore.location=/data/kafka/sslhub/client.keystore.jks
ssl.keystore.password=
ssl.key.password=
ssl.truststore.location=/data/kafka/sslhub/client.truststore.jks
ssl.truststore.password=

password需要根据生成过程设置的密码进行相应补充。

然后重启kafka client即可。

2.添加SSL后的性能问题

开启SSL后,broker和客户端之间、broker之间、或broker与命令行工具之间通过SSL对传输的数据进行加密。这里会有些许性能损耗,损耗的估量由CPU类型以及JVM的实现来决定。

2.1.加密算法对SSL性能的影响

当前可选的算法有RSA、DSA、ECC等,相对来水,ECC性能是最好的,可以提升加解密的效率。

2.2.加密密钥对SSL性能的影响

加密密钥对SSL性能也是有影响的,加密密钥越短,所需要的CPU计算耗时就越少,加密性能越高。

通过实验发现,使用RSA 1024位下生成的SSL证书,相比RSA 2048位下生成的SSL证书,对Kafka生产和消费的性能大约提升5%。

2.3.数据压缩对SSL性能的影响

很明显的一个推断,如果数据量越小,则所需要加解密的时间就越短,kafka生产和消费的性能越高。

经过实验发现,如果对kafka的消息进行压缩,则SSL与PLAINTEXT的性能差距会降低。