找回密码
 注册
查看: 501|回复: 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变量方式

    ' q' v0 ?! P0 V/ m4 j" O$ Q

通过设置以下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方式
    # k: l4 k" P. M: N0 U9 a! }

    5 u* y' M# r8 n- N

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变量方式

    ' X$ K& U1 j  q9 Q2 C: p

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方式


    ! q+ }8 N$ q. S$ r' A8 y) T! z

在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


6 D; M  \( I" b) u6 j

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-11-16 09:54:14 | 显示全部楼层
为 ZooKeeper 配置 SSL/TLS
: w$ O* v7 S8 N2 w7 z  p2 P使用 ThingWorx HA 群集时,可以为 ZooKeeper 配置 SSL 或 TLS:8 J* Y$ j1 k" k( ?- ^; o& }+ u
配置 ZooKeeper' ]- p" f* x5 J# X" a
1.请确保正在运行的 ZooKeeper 版本支持 SSL 或 TLS。
+ w7 N3 r1 K% u8 _+ I% g2.获取您的 SSL 证书和信任存储。' x7 B5 m4 F. I, R2 W" B- k
证书的可接受文件扩展名仅有:JKS、PEM 和 PKCS12(p12)。# x) i4 R$ Y9 Y7 G
3.转至 apache-zookeeper-[version]-bin/conf 并更新或创建 zoo.cfg。  h( j1 u% s. o( d
4.添加以下条目:' `+ C7 h) b$ E  ~2 o
dataDir=/<path-to-zookeeper-data>/data7 n0 T0 o, v4 X2 C) f$ D9 q& y
dataLogDir=/<path-to-zookeeper-datalog>/datalog: Z% D6 i# N# n* k+ @" g% Y
secureClientPort=2281, L! I" o! u8 n" o5 g
tickTime=2000+ j- T" N5 K) j; S% N0 \  {
initLimit=5/ P, @9 W: S1 D4 X$ Y
syncLimit=2; J' H! T! @, z' M% k6 C! ]
autopurge.snapRetainCount=3
% n. R. p- i- c6 {: }  G# ^5 l* qautopurge.purgeInterval=0
/ E! }$ t" P" p2 s+ amaxClientCnxns=604 W& B, c- A! \
admin.enableServer=true
- c) Z; p3 J- z5 _% [9 c: ustandaloneEnabled=false
% ?1 [/ _! ]$ F# l4 uquorumListenOnAllIPs=true
9 I& q: w7 C+ ]% c# A. l1 rsslQuorum=true
! [' T. |: E* T1 l. q要激活 ZooKeeper 节点之间的仲裁,请在 zoo.cfg 文件中设置变量 sslQuorum=true。节点将使用自动生成的 SSL 来保护仲裁。
: [% C' I# {& o- G6 `% b/ d8 t( M; E5.修改 <path to zookeeper>/bin/zkServer.sh
! S5 e: J* [0 E- T.- `' y/ m5 _( y7 w. [$ K  t; s
export SERVER_JVMFLAGS="5 Q! p7 n8 l- t; S0 z* r7 C
-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory5 O. p0 R* ]. h& m3 E7 a% @7 w& a
-Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p121 P# J& g* ?/ W7 T( J3 g
-Dzookeeper.ssl.keyStore.password=<certificate-password>; o3 W9 d- W8 C0 Q: t0 e, B
-Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12, d6 X2 M' e; M" I- c7 J
-Dzookeeper.ssl.trustStore.password=<truststore-password>9 @' Z  Y* z. a& g. O
-Dzookeeper.ssl.quorum.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12- |- Z. \) O0 |5 J) B4 G4 f0 f- r0 g
-Dzookeeper.ssl.quorum.keyStore.password=<certificate-password>
/ V% R1 C4 G7 h# W! `  ~) f. }0 o-Dzookeeper.ssl.quorum.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12% |2 {1 u" a; @4 |/ _% Y
-Dzookeeper.ssl.quorum.trustStore.password=<truststore-password>( y" z/ [! s$ |2 a. T6 d
-Dzookeeper.ssl.quorum.hostnameVerification=false( s, n. T# z5 J, l/ V$ ?
6.启动 ZooKeeper:2 L- Q+ z; }# d1 G& ?1 D7 ~$ [; B
./zkServer.sh start
5 X; U& Z. F/ `+ R$ @7 r0 m7.在日志中,验证配置是否正确:7 ?6 q7 z% f/ U, V1 \# l8 C8 H
tail -f apache-zookeeper-3.5.6-bin/logs/<zookeeper-log-file>
) k7 I/ Q* n0 o, O$ v! k+ s% j3 w配置 ThingWorx
. O8 Q3 A1 Y+ M: A$ Q! R. w1.将 ZooKeeper 证书复制到您的实例,或确保其在运行 ThingWorx 的计算机上可用。
9 d, s8 s! q8 Q3 @/ Z3 ]3 R2.修改 platform-settings.json,使得文件末尾包含下列内容作为根元素,且与 PlatformSettingsConfig 属于同一级别。
# r  `0 ?% c- d9 y3 w% N"ZookeeperSettings": {
; o0 G0 e* E2 T: ?( l) {8 l2 ^    "SSLEnabled": "true",; j0 V4 v5 K/ D- D8 I) ?
    # If SSL is enabled, you must include the following; trust store is optional:
- ^/ R# h7 Y5 K  W8 J    "KeyStorePath": "<path-to-zookeeper-certificates>/zookeeper.p12",( [" G+ ~7 ]! M+ l, O
    "KeyStorePass": "<certificate-password>"," _+ o- w" d5 T* r" m
    "TrustStorePath": "<path-to-zookeeper-certificates>/truststore.p12",
& ^; |" j) V# c) b6 k    "TrustStorePass": "<truststore-password>"3 A% C8 O! ?% @4 F
    "SASLEnabled": "false",
; z2 ]) r$ Z/ |/ `: G) o( P    # If SASL is enabled, you must include the following:5 }$ V4 i' w  k8 N- h& i# H
    "JaasConfPath": "/tmp1/jaas.conf",  ]3 `& e' Y/ M/ D& ]
    "Krb5ConfPath": "/tmp1/krb5.conf"' `, X) m4 ?) ^1 c$ K, Q$ S( r
    }
) q% g* S& I) N* j9 k2 T$ g1 {3.搜索默认 ZooKeeper 端口 2181,并将其替换为安全端口 2281。
: ?0 Q7 J6 e$ b3 T, U4.请确保所有 CoordinatorHosts 条目和 address-resolver > connection ports 均已更新,以便与 zoo.cfg 中的 secureClientPort 值相匹配。
7 e0 Z- q- G2 o1 x配置 Ignite7 p4 H4 v, T2 w5 w2 c2 |% S) m4 z" e, T
1.将 Ignite 证书复制到您的 ThingWorx 实例,或确保其在运行 Ignite 服务器的计算机上可用。
: A; L& j- d: u" j- c& }+ U2.设置 ZOOKEEPER_CONNECTION 环境变量,查找用于启动 Ignite 的 JVM_XOPTS 环境变量,并按如下所示进行更新:
1 ]$ L% [3 @) c. r+ v! z; j# zookeeper1 represents the host name where zookeeper is available and 2281 the secure port from zoo.cfg
$ b5 L: Z5 i: g" Texport ZOOKEEPER_CONNECTION=zookeeper1:2281,zookeeper2:2281,zookeeper3:2281
$ B% ~* v" J! k$ a: \  d# update the JVM_XOPTS
) R3 W) |. v3 ~8 lJVM_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>3 R! E; l) j, C6 }  ]0 m) o) r
配置 Connection Server5 d! i5 V6 [: d, u4 t
1.将 ZooKeeper 证书复制到您的实例,或确保其在运行 Connection Server 的计算机上可用。  [4 X5 _& F7 z  z
2.在 Connection Server 配置文件中更新 cx-server.discovery.connectionString 的端口,以使用安全端口。
" Y. [" q, c; S& f; F6 c0 @5 i% c1 ^2 g例如,cx-server.discovery.connectionString = "{zookeeper-host}:2281"。
2 E. E" ^5 R; G9 Q7 @# M3.将下列系统属性添加到 CONNECTION_SERVER_OPTS 环境变量中。/ H& x+ W; J. }& a9 |8 i
例如:7 i. W. r0 @1 n" C9 x. v
export CONNECTION_SERVER_OPTS="% X! M7 o  d4 D2 `6 p# }
-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty/ H6 v: y/ l5 z
-Dzookeeper.client.secure=true  C4 Z7 t3 J  c& ]( d% h
-Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12
3 z* \$ z4 G! D. K7 B* a7 Z-Dzookeeper.ssl.keyStore.password=<keystore-password>7 v0 ]6 ^/ W2 w  b: b
-Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
- W  o! U/ ]) G) q% i# \& X-Dzookeeper.ssl.trustStore.password=<truststore-password>"
7 p6 N% A* H$ }6 A- G* @. _使用 ThingWorx 安全管理工具加密密码7 L: P; V6 I( @9 I/ G" n% r
如果希望避免将普通密码插入到 platform-settings.json 文件中,则可以使用安全工具加密 twx-keystore 内的密码。您必须分别使用适用于密钥存储和信任存储密码的 encrypt.zk.keystore.password 和 encrypt.zk.truststore.password 对密码进行加密。
9 A9 A/ b5 G' C. M1 Q: _% G; ~./security-common-cli keystore.conf set encrypt.zk.keystore.password "ptcptc"$ d! p$ F2 J) z! }% U' Q9 x. q
然后,更改 platform-settings.json 文件,以使得 ThingWorx 从密钥存储中选择密码:5 b8 v0 v. b1 J& V- T) M% x
"KeyStorePass": "encrypt.zk.keystore.password",
) p- y' l6 N3 w"TrustStorePass": "encrypt.zk.truststore.password"
* f) T! o" U7 i% t: D- D. s# }% T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:12 , Processed in 0.016596 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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