ZooKeeper安全认证机制:SSL
本文探讨ZooKeeper的SSL安全机制。默认情形下,ZooKeeper的网络通信是没有加密的,但ZooKeeper提供了SSL特性,目前仅应用在Client与Server端之间的交互(Server与Server之间的交互尚不支持),且RPC通信协议基于Netty时(ZooKeeper内置的NIO实现中不支持)。
SSL简介
SSL全称为Secure Socket Layer
,它是一种介于传输层和应用层的协议,它通过”握手协议”和“传输协议”来解决信息传输的安全问题,它可以被建立在任何可靠的传输层协议之上(例如TCP,但不能是UDP)。SSL协议主要提供如下三方面的能力:
- 信息的加密传播
- 校验机制,数据一旦被篡改,通信双方均会立刻发现
- 身份证书,防止身份被冒充
SSL的基本设计思想:
- Client向Server端索要”公钥“
- Client对获取的”公钥“进行校验
- 双方协商生成“会话密钥”
- 双方基于”会话密钥“进行信息交换
前3步称之为”握手阶段”,”握手阶段”采用”非对称加密“算法。
第4步称之为”传输阶段”,基于”对称加密“算法,”对称加密”算法的性能是远高于”非对称加密”算法的,因此,更适用于大数据量的传输加密。
如何使用
Client端配置
ZooKeeper Client通过配置如下系统属性来启用基于Netty的RPC通信层:
zookeeper.clientCnxnSocket=”org.apache.zookeeper.ClientCnxnSocketNetty”
Client需要设置如下参数来启用安全通信:
zookeeper.client.secure=true
设置了zookeeper.client.secure
属性为true
以后,意味着Client与Server之间只能通过"secureClientPort"
所指定的端口进行交互。
最后,需要配置KeyStore与TrustStore的相关系统属性:
zookeeper.ssl.keyStore.locati