找回密码
 注册
查看: 503|回复: 1

zkServer添加ssl协议支持方式

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-11-16 09:53:14 | 显示全部楼层 |阅读模式

ZooKeeper的默认网络通信没有加密,开源社区在ZOOKEEPER-2125中加入了netty以支持SSL。

值得一提的是,和其他一些开源组件一样,ZooKeeper的SASL认证配置和SSL配置都可以通过JVM变量配置。这样一来配置起来比较方便,但也带来一些问题。例如在一个JVM中启动多个ZooKeeper时,会有配置冲突。

客户端配置
  • JVM变量方式


    8 z% Z* N% @0 H

通过设置以下JVM变量启用Netty:

zookeeper.clientCnxnSocket="org.apache.zookeeper.ClientCnxnSocketNetty"

通过设置以下JVM变量启用安全通信:

zookeeper.client.secure=true

设置“secure”后的客户端只能访问服务器的“secureClientPort“

设置keystore 和 truststorJVM环境变量:

zookeeper.ssl.keyStore.location="/path/to/your/keystore"

zookeeper.ssl.keyStore.password="keystore_password"

zookeeper.ssl.trustStore.location="/path/to/your/truststore"

zookeeper.ssl.trustStore.password="truststore_password"

  • ZKClientConfig方式, f- d0 h& P5 W6 W3 ~. Q' ^7 K

      k' ?% I- ~+ x# z

ZKClientConfig clientConfig = new ZKClientConfig();

conf.setProperty(ZKClientConfig.SECURE_CLIENT, "true");

conf.setProperty(ZKClientConfig.ZOOKEEPER_CLIENT_CNXN_SOCKET, "org.apache.zookeeper.ClientCnxnSocketNetty");

conf.setProperty(ZKClientConfig.SSL_KEYSTORE_LOCATION, "KeyStorePath");

conf.setProperty(ZKClientConfig.SSL_KEYSTORE_PASSWD, "KeyStorePasswd");

conf.setProperty(ZKClientConfig.SSL_TRUSTSTORE_LOCATION, "TrustStorePath");

conf.setProperty(ZKClientConfig.SSL_TRUSTSTORE_PASSWD, "TrustStorePasswd");

借助ZKClientConfig社区还实现了在同一个JVM中启动多个客户端分别连接开启Kerberos认证的不同的ZooKeeper集群,或分别连接开启认证与未开启认证的ZooKeeper集群,有机会单开一篇文章介绍。

Server端
  • JVM变量方式


    % n2 v( w& n4 g

Server可以直接在zkServer.sh中增加配置:

export SERVER_JVMFLAGS="

-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory

-Dzookeeper.ssl.keyStore.location=testKeyStore.jks

-Dzookeeper.ssl.keyStore.password=testpass

-Dzookeeper.ssl.trustStore.location=testTrustStore.jks

-Dzookeeper.ssl.trustStore.password=testpass"

export CLIENT_JVMFLAGS="

-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty

-Dzookeeper.client.secure=true

-Dzookeeper.ssl.keyStore.location=testKeyStore.jks

-Dzookeeper.ssl.keyStore.password=testpass

-Dzookeeper.ssl.trustStore.location=testTrustStore.jks

-Dzookeeper.ssl.trustStore.password=testpass"

端口在zoo.cfg中添加:

secureClientPort=2281

所有SSL模式客户端都应该连接到这一端口

  • zoo.cfg方式


    1 \7 ^9 V# u! }# p

在zoo.cfg中添加:

secureClientPort=3183

serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory

ssl.keyStore.location=testKeyStore.jks

ssl.keyStore.password=testpass

ssl.trustStore.location=testTrustStore.jks

ssl.trustStore.password=testpass


! H7 _/ ^; Z% j+ {" I

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-11-16 09:54:14 | 显示全部楼层
为 ZooKeeper 配置 SSL/TLS
' R3 `3 w, {" U' M使用 ThingWorx HA 群集时,可以为 ZooKeeper 配置 SSL 或 TLS:
, o# e9 a; V4 f* `, _, {配置 ZooKeeper
5 k3 f3 O* w5 X6 V1.请确保正在运行的 ZooKeeper 版本支持 SSL 或 TLS。' ^/ m" X$ l3 U: o! i
2.获取您的 SSL 证书和信任存储。
2 @  g5 m" f( i! k# e( {证书的可接受文件扩展名仅有:JKS、PEM 和 PKCS12(p12)。2 g# j" s6 K2 U8 y
3.转至 apache-zookeeper-[version]-bin/conf 并更新或创建 zoo.cfg。; K8 o) z) L: Y' k& k
4.添加以下条目:+ ~" k  Y9 n- `, [
dataDir=/<path-to-zookeeper-data>/data
' e. R; G; K: z$ F- c  gdataLogDir=/<path-to-zookeeper-datalog>/datalog1 \& r' Q0 J* L
secureClientPort=2281
/ C0 |+ \% k, M3 dtickTime=2000+ W, l& f3 \) ?3 T0 t) r
initLimit=5, l' _! e+ W# ]) e
syncLimit=2
, u2 T. R, ^) xautopurge.snapRetainCount=3
8 i1 R1 G2 h1 h; t' K, Yautopurge.purgeInterval=02 P1 B5 x# w4 s' ]3 M
maxClientCnxns=60! [9 k4 j! L! Q3 P$ [+ Y4 D
admin.enableServer=true$ w1 w+ Y5 }" k
standaloneEnabled=false
, G, a' ?0 J& `% nquorumListenOnAllIPs=true* F. [, G6 O+ \
sslQuorum=true& K. {9 N2 ~5 V. u: z4 a# T
要激活 ZooKeeper 节点之间的仲裁,请在 zoo.cfg 文件中设置变量 sslQuorum=true。节点将使用自动生成的 SSL 来保护仲裁。' q) u; H* E! k) s! P2 O* i6 i! ^! V
5.修改 <path to zookeeper>/bin/zkServer.sh, D" f' H; F# @8 F
.1 C$ M% f6 [1 {
export SERVER_JVMFLAGS="
( @/ w$ d; ^; m( h7 A-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
' d. T; `* w# L5 m% V- A0 Q4 p3 C-Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12
' M5 d5 i. B* Z' h6 j0 y-Dzookeeper.ssl.keyStore.password=<certificate-password>4 }" E2 g2 f% _+ L
-Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
9 c" y! a+ V8 e8 |: X" Z-Dzookeeper.ssl.trustStore.password=<truststore-password>7 M' q8 D/ _$ f4 A
-Dzookeeper.ssl.quorum.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p120 V8 i# h* y" J7 a* ~
-Dzookeeper.ssl.quorum.keyStore.password=<certificate-password>
) t8 U. `7 V4 j" M-Dzookeeper.ssl.quorum.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
1 }9 K" x8 i0 [  u-Dzookeeper.ssl.quorum.trustStore.password=<truststore-password>
+ O: a* \6 B  K- x# [1 C6 K-Dzookeeper.ssl.quorum.hostnameVerification=false5 @% R1 r; o/ p2 A" z
6.启动 ZooKeeper:
: ?4 {) u/ s2 a: w( c8 @( A./zkServer.sh start+ r) c2 y3 d2 S  L( x8 a
7.在日志中,验证配置是否正确:8 i" j+ B( t6 k, s
tail -f apache-zookeeper-3.5.6-bin/logs/<zookeeper-log-file>; F8 r1 E( {5 ~3 A! g. W
配置 ThingWorx
9 J# I1 f! I" I+ `* k& O0 i1.将 ZooKeeper 证书复制到您的实例,或确保其在运行 ThingWorx 的计算机上可用。) Y7 D* U. j: v" ~
2.修改 platform-settings.json,使得文件末尾包含下列内容作为根元素,且与 PlatformSettingsConfig 属于同一级别。( p9 I8 m3 n6 v$ n
"ZookeeperSettings": {2 o/ k! z- q4 j
    "SSLEnabled": "true",4 {+ h1 C7 Z7 A# f: r: G
    # If SSL is enabled, you must include the following; trust store is optional:" A% s7 y; z! u
    "KeyStorePath": "<path-to-zookeeper-certificates>/zookeeper.p12",
8 |) B* {9 u+ _! b4 m& _9 o    "KeyStorePass": "<certificate-password>",
9 ~7 m! `- c5 \: S: ^. h    "TrustStorePath": "<path-to-zookeeper-certificates>/truststore.p12"," o( E/ m; }6 L3 _
    "TrustStorePass": "<truststore-password>". y4 \' N/ Z( E* W9 |5 s* w
    "SASLEnabled": "false",
3 S3 A+ N5 e5 h. C/ @0 j4 Q    # If SASL is enabled, you must include the following:
8 c* Y' c6 u4 b# r: v7 |    "JaasConfPath": "/tmp1/jaas.conf",! M, ~0 X1 M+ f! g9 _+ \
    "Krb5ConfPath": "/tmp1/krb5.conf"
, \* b, F5 S6 O& z  |    }
; n8 Z9 u0 @# E! ?3.搜索默认 ZooKeeper 端口 2181,并将其替换为安全端口 2281。( o+ X; d- o) G( C  ?
4.请确保所有 CoordinatorHosts 条目和 address-resolver > connection ports 均已更新,以便与 zoo.cfg 中的 secureClientPort 值相匹配。, o8 q: Q0 ~  t( I* q: O: `
配置 Ignite& `" n$ v( G0 y9 y$ ^
1.将 Ignite 证书复制到您的 ThingWorx 实例,或确保其在运行 Ignite 服务器的计算机上可用。
  P, g% }$ O' V7 Z# `8 X) M2.设置 ZOOKEEPER_CONNECTION 环境变量,查找用于启动 Ignite 的 JVM_XOPTS 环境变量,并按如下所示进行更新:$ i# G# h0 o1 q
# zookeeper1 represents the host name where zookeeper is available and 2281 the secure port from zoo.cfg
) N; D* N; q0 nexport ZOOKEEPER_CONNECTION=zookeeper1:2281,zookeeper2:2281,zookeeper3:2281# \4 U/ P' s6 ]+ E
# update the JVM_XOPTS
+ K7 z; j/ R# N- UJVM_XOPTS=-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true -Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12 -Dzookeeper.ssl.keyStore.password=<keystore-password> -Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12 -Dzookeeper.ssl.trustStore.password=<truststore-password>. V. Y: h( e* w! d* N3 z
配置 Connection Server
' g0 V1 y2 P8 ?! l1.将 ZooKeeper 证书复制到您的实例,或确保其在运行 Connection Server 的计算机上可用。4 n" ]5 x8 K* _' ~
2.在 Connection Server 配置文件中更新 cx-server.discovery.connectionString 的端口,以使用安全端口。* b8 P; M# @1 ?3 Y/ E5 ^2 L1 Q
例如,cx-server.discovery.connectionString = "{zookeeper-host}:2281"。+ W3 q5 c) t& u
3.将下列系统属性添加到 CONNECTION_SERVER_OPTS 环境变量中。* o3 E' g& k( d, ^
例如:6 v7 D- D  ]0 U- ~  ?3 y3 T
export CONNECTION_SERVER_OPTS="- Y/ y) |% f2 V5 t. {" W. m
-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
& h7 ], K9 D- b8 T1 H/ a  ]-Dzookeeper.client.secure=true# L2 P6 q( q8 J4 u" l
-Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p126 N  `4 f! L8 s  p7 i9 r
-Dzookeeper.ssl.keyStore.password=<keystore-password>' \1 ?! V( u, i! N$ ]
-Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
9 ?3 y3 \& J# n( Y$ i-Dzookeeper.ssl.trustStore.password=<truststore-password>"# }: j' |$ \- c! i# F/ E
使用 ThingWorx 安全管理工具加密密码
: M& V' ^! S% a5 _& A如果希望避免将普通密码插入到 platform-settings.json 文件中,则可以使用安全工具加密 twx-keystore 内的密码。您必须分别使用适用于密钥存储和信任存储密码的 encrypt.zk.keystore.password 和 encrypt.zk.truststore.password 对密码进行加密。
0 ~6 q5 W, _' a' }" C./security-common-cli keystore.conf set encrypt.zk.keystore.password "ptcptc"
+ U2 d# H# f8 x0 |3 D# e然后,更改 platform-settings.json 文件,以使得 ThingWorx 从密钥存储中选择密码:/ K* x+ B: u! c* R: H9 H
"KeyStorePass": "encrypt.zk.keystore.password",  h" s) m  ^5 V  k
"TrustStorePass": "encrypt.zk.truststore.password"/ F' U# O$ N( A2 W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:06 , Processed in 0.084091 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表