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的性能差距会降低。