给 ZooKeeper 加 TLS 要配哪些东西?哪些错误配置会让加固失效?这篇用本机生成的 CA 与证书,从配置、信任、主机名校验、明文端口四个方面验证,最后量一下 TLS 的延迟代价。
明文客户端连 TLS 端口 7301 → KeeperErrorCode = ConnectionLoss for / | Exiting JVM with code 1 TLS 客户端(信任 CA)连 7301 → [zookeeper] TLS 客户端(不信任这个 CA,用 JVM 默认信任库)连 7301 → Unexpected throwable | io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: (certificate_unknown) PKIX path building failed: sun.security.provide 同一个服务端的明文端口 7300 仍然可用 → [zookeeper] (这就是「开了 TLS 还留着明文端口」的风险)
配置:secureClientPort、serverCnxnFactory=…NettyServerCnxnFactory、ssl.keyStore.location / password / type、ssl.trustStore.*;客户端用 zookeeper.client.secure=true 与 ClientCnxnSocketNetty。证书由本机 openssl 生成,有效期 30 天,仅用于实验。
SAN 匹配 → [zookeeper] 换成 CN=wrong.example.com、没有 SAN 的服务端证书 → Unexpected throwable | io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: (certificate_unknown) No name matching localhost found 客户端关掉主机名校验(zookeeper.ssl.hostnameVerification=false)→ [zookeeper] (能连上,但失去了防冒充的保护)
明文客户端连 7305 → KeeperErrorCode = ConnectionLoss for / | Exiting JVM with code 1 TLS 客户端连 7305 → [zookeeper]
明文 p50 3.03 ms;TLS p50 3.01 ms