From 3e4e447af320aa3d1c64b9550041ef72b76659e4 Mon Sep 17 00:00:00 2001 From: lysu Date: Wed, 15 Apr 2020 16:53:44 +0800 Subject: [PATCH] *: update the recent improvements about tls/security (#2417) --- .../secure/enable-tls-between-components.md | 50 +++++++++++++++++- how-to/secure/enable-tls-clients.md | 37 +++++++++++-- media/sqlgram/AlterInstanceStmt.png | Bin 0 -> 29557 bytes reference/sql/statements/alter-instance.md | 37 +++++++++++++ reference/tools/tidb-control.md | 3 ++ 5 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 media/sqlgram/AlterInstanceStmt.png create mode 100644 reference/sql/statements/alter-instance.md diff --git a/how-to/secure/enable-tls-between-components.md b/how-to/secure/enable-tls-between-components.md index 3ef9688e8f3c..b830798a689b 100644 --- a/how-to/secure/enable-tls-between-components.md +++ b/how-to/secure/enable-tls-between-components.md @@ -11,7 +11,7 @@ category: how-to 本部分介绍 TiDB 集群如何开启 TLS 验证,TLS 验证支持: -- TiDB 组件之间的双向验证,包括 TiDB、TiKV、PD 相互之间,TiKV Control 与 TiKV、PD Control 与 PD 的双向认证,以及 TiKV peer 之间、PD peer 之间。一旦开启,所有组件之间均使用验证,不支持只开启某一部分的验证。 +- TiDB 组件之间的双向验证,包括 TiDB、TiKV、PD 相互之间,TiDB Control 与 TiDB、 TiKV Control 与 TiKV、PD Control 与 PD 的双向认证,以及 TiKV peer 之间、PD peer 之间。一旦开启,所有组件之间均使用验证,不支持只开启某一部分的验证。 - MySQL Client 与 TiDB 之间的客户端对服务器身份的单向验证以及双向验证。 MySQL Client 与 TiDB 之间使用一套证书,TiDB 集群组件之间使用另外一套证书。 @@ -72,10 +72,16 @@ MySQL Client 与 TiDB 之间使用一套证书,TiDB 集群组件之间使用 > **注意:** > - > 若 TiDB 集群各个组件间已开启 TLS,在使用 tikv-ctl 或 pd-ctl 工具连接集群时,需要指定 client 证书,示例: + > 若 TiDB 集群各个组件间已开启 TLS,在使用 tidb-ctl、tikv-ctl 或 pd-ctl 工具连接集群时,需要指定 client 证书,示例: {{< copyable "shell-regular" >}} + ```bash + ./tidb-ctl -u https://127.0.0.1:10080 --ca /path/to/ca.pem --ssl-cert /path/to/client.pem --ssl-key /path/to/client-key.pem + ``` + + {{< copyable "shell-regular" >}} + ```bash ./pd-ctl -u https://127.0.0.1:2379 --cacert /path/to/ca.pem --cert /path/to/client.pem --key /path/to/client-key.pem ``` @@ -86,6 +92,46 @@ MySQL Client 与 TiDB 之间使用一套证书,TiDB 集群组件之间使用 ./tikv-ctl --host="127.0.0.1:20160" --ca-path="/path/to/ca.pem" --cert-path="/path/to/client.pem" --key-path="/path/to/clinet-key.pem" ``` +3. 配置校验调用者 Common Name。 + + 通常被调用者除了校验调用者提供的密钥、证书和 CA 有效性外,还需要校验调用方身份(例如:TiKV 只能被 TiDB 访问,需阻止拥有合法证书但非 TiDB 的其他访问者访问 TiKV)。推荐在生成证书时通过 `Common Name` 标识证书使用者身份,并在被调用者配置检查证书 `Common Name` 列表来检查调用者身份。 + + - TiDB + + 在 `config` 文件或命令行参数中设置: + + ```toml + [security] + cluster-verify-cn = [ + "TiDB-Server", + "TiKV-Control", + ] + ``` + + - TiKV + + 在 `config` 文件或命令行参数中设置: + + ```toml + [security] + cert-allowed-cn = [ + "TiDB-Server", "PD-Server", "TiKV-Control", "RawKvClient1", + ] + ``` + + - PD + + 在 `config` 文件或命令行参数中设置: + + ```toml + [security] + cert-allowed-cn = ["TiKV-Server", "TiDB-Server", "PD-Control"] + ``` + +4. 重加载证书。 + + TiDB、PD 和 TiKV 会在每次新建相互通讯的连接时重新读取当前的证书和密钥文件内容,实现证书和密钥的重加载。目前暂不支持 CA 的重加载。 + ### MySQL 与 TiDB 间开启 TLS 请参考 [使用加密连接](/how-to/secure/enable-tls-clients.md)。 diff --git a/how-to/secure/enable-tls-clients.md b/how-to/secure/enable-tls-clients.md index 1368d558be5e..41cd00d18dd2 100644 --- a/how-to/secure/enable-tls-clients.md +++ b/how-to/secure/enable-tls-clients.md @@ -7,7 +7,7 @@ category: how-to TiDB 服务端默认采用非加密连接,因而具备监视信道流量能力的第三方可以知悉 TiDB 服务端与客户端之间发送和接受的数据,包括但不限于查询语句内容、查询结果等。若信道是不可信的,例如客户端是通过公网连接到 TiDB 服务端的,则非加密连接容易造成信息泄露,建议使用加密连接确保安全性。 -TiDB 服务端支持启用基于 TLS(传输层安全)协议的加密连接,协议与 MySQL 加密连接一致,现有 MySQL 客户端如 MySQL 运维工具和 MySQL 驱动等能直接支持。TLS 的前身是 SSL,因而 TLS 有时也被称为 SSL,但由于 SSL 协议有已知安全漏洞,TiDB 实际上并未支持。TiDB 支持的 TLS/SSL 协议版本为 TLS 1.0、TLS 1.1、TLS 1.2。 +TiDB 服务端支持启用基于 TLS(传输层安全)协议的加密连接,协议与 MySQL 加密连接一致,现有 MySQL 客户端如 MySQL 运维工具和 MySQL 驱动等能直接支持。TLS 的前身是 SSL,因而 TLS 有时也被称为 SSL,但由于 SSL 协议有已知安全漏洞,TiDB 实际上并未支持。TiDB 支持的 TLS/SSL 协议版本为 TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3。 使用加密连接后,连接将具有以下安全性质: @@ -15,13 +15,24 @@ TiDB 服务端支持启用基于 TLS(传输层安全)协议的加密连接 - 完整性:流量明文无法被篡改; - 身份验证(可选):客户端和服务端能验证双方身份,避免中间人攻击。 -TiDB 的加密连接支持默认是关闭的,必须在 TiDB 服务端通过配置开启加密连接的支持后,才能在客户端中使用加密连接。另外,与 MySQL 一致,TiDB 加密连接是以单个连接为单位的,并且是可选的,因而对于开启了加密连接支持的 TiDB 服务端,客户端既可以选择通过加密连接安全地连接到该 TiDB 服务端,也可以选择使用普通的非加密连接。大部分 MySQL 客户端默认不采用加密连接,因此一般还要显式地要求客户端使用加密连接。 - -简单来说,要使用加密连接必须同时满足以下两个条件: +TiDB 的加密连接支持默认是关闭的,必须在 TiDB 服务端通过配置开启加密连接的支持后,才能在客户端中使用加密连接,要使用加密连接必须同时满足以下两个条件: 1. TiDB 服务端配置开启加密连接的支持 2. 客户端指定使用加密连接 +另外,与 MySQL 一致,TiDB 加密连接是以单个连接为单位的,默认情况下是可选的。因而对于开启了加密连接支持的 TiDB 服务端,客户端既可以选择通过加密连接安全地连接到该 TiDB 服务端,也可以选择使用普通的非加密连接。如需强制要求客户端使用加密连接可以通过以下两种方式进行配置: + ++ 通过在启动参数中配置 `--require-secure-transport` 要求所有用户必须使用加密连接来连接到 TiDB。 ++ 通过在创建用户 (`create user`),赋予权限 (`grant`) 或修改已有用户 (`alter user`) 时指定 `require ssl` 要求指定用户必须使用加密连接来连接 TiDB。以创建用户为例: + + ```sql + create user 'u1'@'%' require ssl; + ``` + +> **注意:** +> +> 如果登录用户已配置使用 [TiDB 证书鉴权功能](/reference/security/cert-based-authentication.md#配置登陆时需要校验的用户证书信息)校验用户证书,也会隐式要求对应用户必须使用加密连接连接 TiDB。 + ## 配置 TiDB 启用加密连接支持 在启动 TiDB 时,至少需要在配置文件中同时指定 `ssl-cert` 和 `ssl-key` 参数,才能使 TiDB 服务端接受加密连接。还可以指定 `ssl-ca` 参数进行客户端身份验证(请参见[配置启用身份验证](#配置启用身份验证)章节)。 @@ -64,6 +75,12 @@ ssl-key = "certs/server-key.pem" 若证书参数无误,则 TiDB 在启动时将会输出 `secure connection is enabled`,否则 TiDB 会输出 `secure connection is NOT ENABLED`。 +## 重加载证书密钥和 CA + +在需要替换证书、密钥或 CA 时,可以在完成对应文件替换后,对运行中的 TiDB 实例执行 [`ALTER INSTACE RELOAD TLS`](/reference/sql/statements/alter-instance.md) 语句从原配置的证书 ([`ssl-cert`](/reference/configuration/tidb-server/configuration-file.md#ssl-cert))、密钥 ([`ssl-key`](/reference/configuration/tidb-server/configuration-file.md#ssl-key)) 和 CA ([`ssl-ca`](/reference/configuration/tidb-server/configuration-file.md#ssl-ca)) 的路径重新加证书、密钥和 CA 文件,而无需重启 TiDB 实例。 + +新加载的证书密钥和 CA 将在语句执行成功后对新建立的连接生效,不会影响语句执行前已建立的连接。 + ## 配置 MySQL 客户端使用加密连接 MySQL 5.7 及以上版本自带的客户端默认尝试使用安全连接,若服务端不支持安全连接则自动退回到使用非安全连接;MySQL 5.7 以下版本自带的客户端默认采用非安全连接。 @@ -84,9 +101,15 @@ MySQL 5.7 及以上版本自带的客户端默认尝试使用安全连接,若 - 若要使 TiDB 服务端验证 MySQL 客户端身份,TiDB 服务端需配置 `ssl-cert`、`ssl-key`、`ssl-ca` 参数,客户端需至少指定 `--ssl-cert`、`--ssl-key` 参数。必须确保服务端配置的证书和客户端配置的证书都是由服务端配置指定的 `ssl-ca` 签发的。 - 若要进行双向身份验证,请同时满足上述要求。 +默认情况,服务端对客户端的身份验证是可选的。若客户端在 TLS 握手时未出示自己的身份证书,也能正常建立 TLS 连接。但也可以通过在创建用户 (`create user`),赋予权限 (`grant`) 或修改已有用户 (`alter user`) 时指定 `require 509` 要求客户端需进行身份验证,以创建用户为例: + +```sql +create user 'u1'@'%' require x509; +``` + > **注意:** > -> 目前 TiDB 尚不支持强制验证客户端身份,即服务端对客户端的身份验证是可选的。若客户端在 TLS 握手时未出示自己的身份证书,也能正常建立 TLS 连接。 +> 如果登录用户已配置使用 [TiDB 证书鉴权功能](/reference/security/cert-based-authentication.md#配置登陆时需要校验的用户证书信息)校验用户证书,也会隐式要求对应用户需进行身份验证。 ## 检查当前连接是否是加密连接 @@ -131,6 +154,7 @@ TiDB 支持的 TLS 版本及密钥交换协议和加密算法由 Golang 官方 - TLS 1.0 - TLS 1.1 - TLS 1.2 +- TLS 1.3 ### 支持的密钥交换协议及加密算法 @@ -156,3 +180,6 @@ TiDB 支持的 TLS 版本及密钥交换协议和加密算法由 Golang 官方 - TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_GCM\_SHA384 - TLS\_ECDHE\_RSA\_WITH\_CHACHA20\_POLY1305 - TLS\_ECDHE\_ECDSA\_WITH\_CHACHA20\_POLY1305 +- TLS\_AES\_128\_GCM\_SHA256 +- TLS\_AES\_256\_GCM\_SHA384 +- TLS\_CHACHA20\_POLY1305\_SHA256 diff --git a/media/sqlgram/AlterInstanceStmt.png b/media/sqlgram/AlterInstanceStmt.png new file mode 100644 index 0000000000000000000000000000000000000000..99ce13d7d7504b7c768bffe40fabc171f8f4eb6d GIT binary patch literal 29557 zcmd?RRa~3f6E@o2?v_#t6ev)FkcYAc=YHIrj#T|>CvO7JHYe$^T)tX z^J0G{;O&XiCn=TZ&!59q#1@1%kw^Dq&eTG*(jNg z&D&!HlUu`j+Ikvk10B3Q`n3rTFzo+c1&l0^C;xr;Hjv@{--nC|h1S3R{eyx9J^a5m z1zd4<|2?Y^5Ago?%!r8~`R_UY*D>b5&)=j!qn`cy{2@2<|LWeEcvY$#UazR3@K&4j z{nrnl_n!XSE`xnpGNg(TP9@B8dmKMF#NF7~Xw(x{xK0@%CznJ-RMlNl!swdmO~|G< zG&EG=O(H5PN=;3T=z0<_DJ$FJdA5@+5s8b7D@GNamPQ`gTU}k}$(Ka{R-zYGG%(AlW=g*%>)u#Ofiwg@pm)Fo$kDaYR3N;ZA zTs0Jru-Cb9u{Wp7&Q#5*^W17%Z{+Uwb|o%)Q&x7Cx_8^^P*Qbww-~;Sk&%(0<9Z)r zu#J<8E3Qnl&Gxo-_j?tluf|bJVx9WuK*nq;BCLPrk({%0JpBDL+F<#D-|~n30bY*= zkGdZ}qzO-sEsto3k$1PtU0r|A8A?f^hqhNB4p%zU{Y3IJ-nJbNDk>@rK0VIBAY>g%<}MzX z|97807%7PDf^X5V>2=bh(|lJt#Ps1Sn6F|uZmLW|`RKqwSY$%=Zb-ektC`Y8KfR0U zQ%G(utzbL1CoL`Q$)?}1&SXyTG;b*3#r9$$;nA{x0i|Bj9hV9ra;9-JH;9GpzbGBSf53t2Wzkk4q?M+fV=zHD@IDMO=d`(?*%_qXz% zYlzUqNODo!&}xZGR8kVS-_v)o#U~JDZ-lp|C+wwmVnK0taX5QqG@2f`xq+CUpT#2P zvLE`*K0iPILf_Zb^}IWj(BI!bJKN|d6=h&2J3EhqtE(jpVl$d1Y-4Sm15Oq4U}R(C z<>d`T%>w$iz0)eJgvCPI=)C_4)ZN`JpDu!dfe{)O78D*XBO^Q9KR7);&d$MARc*CY zq`Ld@2^z%NLQ^CLR%hGW-P=!aeZFsHVuDXW;kSMm9W@peHuS}bv)XpCQ9ezmzpD$h zVnvw+yo%M!ms;G|sDy-M-Y&n=)X=DLu;Vn|8iUvfEqbY!>H3@=Dtd~08hrd- z7+k1btmbodO3q;%v;cO!U%GV{{|R#5nd+Y@)t0eyYS3}QaB_3IAfgxv3Xaf3twr`m zQp7H~Y@Vmi*3UvK%abBo9M;6In!f)G3#<3_Z3WT1dOnga$_DEh7$~xXw*o8u>o2pB zR6#-t3Nvf#iGG;ZKpX=>0zuXAr_Z0TDfn@5a6W<#4od0d)0jg;EYnsTrMTV4zAAGn z2iTGQa{{;=iZ`PqwgGP61dOGwuHgDZ~w)+nOobqDgAlHM5 zhGTOcyCn{no!4`#M{B)_EY}CaVD|u$i(RPS^*J2OWub&BLoPKmS)<(AFOV`&ohHw4 ze#_Cubm(o(4&9t#Vwo=6`?4J-&-uQ-zVf!atEoa|N3e&77X`nw#(^*c1H)Vug3!;; zFIrNgeRsqAay;;E7m61h8fs-}Dg6|TgX449J}Y`R`w`@33nvn=HmB9b9Usf=^hKG3 z>TqT;DCfPW7WKVxA1l>vyE`t{k*8%U&I`mQvxH~1EI1{^#qBLLoNT5;b8~ZJs7keJ z?@mTjZRTsDOFeG*tPh$Sus?mqw?(e+-E2|_CZRo?`06*=_qgN!V`y?Ca`-Jnf^|se z)189ya#5eFFu!|Yy>U~Jv60dB4T_V>^L$V9;$YEa*Xwi-)fs}^^gimYHj__+X=`X5 zz?;ftpseNky{uX_TQ?}DA+Oq+nmX$_4vPuUwxKMi4r`(9LcOLU0^^^ZA#NDxY2|mX z7|Q6z>ydxMWBuE@vZ7*nwn+^ebLE=C_cyzdxL7R-Rio$GKvd@EfQ}GLDiG*y_cjod zg0*;YD$#baDY1Odn#aTulMursJ@}=QQPV0u1Hr$gu2Jft}+M6EhPrNNpNj)Bzmke!dTDbLf0F$3sq@MsmYT%I|1A znKxXj74NDZ?1?(gPghf|nv54MV`g9|^NpGYCZRU23n;wrSy9c&i0J*Eh{th`wW7Sd z-{s+ozAp-~3D|nesjYXiCF|s6+1bh{ZIxE1gu=q@Z+|_>|B}REyKs4Ti)P;-w9x|C zC1K|+`+Yr`PaWX3-g}cW&5Ezzb?`sS%eQ^*jUa1j9vZ^0>GZt2K?PFy((F=A0T#O| zcMywQsNSeIg7UL87z=?w_+D-2S9QDE!1{&d-7ilfMXvh#=NhsTp@465y=@3Zy&E*Q zlEDk>)ahR_?_UxoBkOK?`tiQ-O9?!=B8!_ZMC6cQ*}@;Xf>#s$+MQR5)o~WD~^-3 z2n?usdU)wKcx&1Y?(Oa2GpY3v2zq+x^7-khtE)F&-d!U-JUr;==%fhUkV`Fw-HvlP z;{z+p%kPbP0&QTm2zx%jGhA9hS$k4rn%t0ld^J(5q#{ar&c~yoe%NGMT97D78fcj= zti~bMI=se8es|_zD7X_3cj?WWH+|h-4Gh@5&U>jP!nWp1nX2id($hu#?z}hLhoI&9 z=|Ub#V&&blv&Qo^g^P_YoSfWE6r|0T(?!kA69l|&2McL@4nI!Mfs=cGQw>JVqT{_Q z0Z`l26zEE;Ouwzwusb9Wn__@Rqt!dWnv?<$FP2H26$XRJ5CS_UXuII9$-dPeTcQ22 z&hvEdBPc>HLd3`WaXDH7h8ivzK0X<~%X*&ym7~?P<@{9PWWIc23%{V-U8U0|1*h4F zK!-all9XTQ>z{8SdaYm5mwfWRq#8mOSQ!O&u91F{($dCDuv{x>Fy6by#(ElBy4xB{ zd?x{jpc_)!PDS*;eY4Ez002rAi&ak;`DYM-#adfihbI02kVTzYU$2clRnRSh|8B6i z+H4RwSY2yJ-nZWO3k}MRzrkQUV&Zw_araKp>52r!+4f?-SSUeWUYlXRveMjFfu@VS^X*9q&nBz7GR+?)n0I$oUU)?1CdfM< z5bm7e1-UT9c5z_E-nhKGw|DaxF=*v?H`mjX5ClLeHofMzFyHmQ=&Jefsd|TdBM72_ z$XQvdl`=~f%!^IL0V?}NMMouc1GZ~L8EuaEcwKM=zA6hSTWm}fI)g;3Y_g`-*48HZ zBl-9RIVC_Gbro+`HtDp#$VrzCmi>1Ka_YVD$jL{nKd&rr(UWMNw_Ge4B|O8T5V%>a zGC70MuJ?qK40YdLW2XqJoAMcKPl<8>_F7G$g>u{d5684My$Wpu`4=)lXX6ArN1{n| zetrQljx6B2gAkjxS}XX-WM{Td(>ZY5g@lFqNF!2Hb@!>FC20Ux)!=h|9-A+}2Jgzx z%b}sme-9pgrKp&@*gMchuwh8PR;$zE8Seq5qwu3DUhLc2+G0kXYj5v^dF?omo`=hA z+mmMRp~lVNSJFFYyBc#gXn_RZze5RFbqegmDD$=o3Zkhc78`uP{9-Dy{VnK24vE2% ztSzt_S2I=)cowk-YBd0)q=i*nU_|(jf&I41B#z4CHR|cJ1zZ+vqAJ*Weg5Z9US8XU z!=t0Z-rt5sgIr?hFPqg+=T##**6i%1_CNNeV&C;+5-6*vydlQLCB~)Ft*NWiulQ;} zn+j%hxVbz6Ohi{tk6MdGt?IEBF5W;*z;@qnCh5%js@@~uEYZn#FwXxTAd|4N+FfjN zllUn?D&TmzGhG}>AzWtuCL3@&Hf{G1>+OkwwL%f{Nd37MZ#~)zHGMIsp?`y;KE*N1 zyqui%!xicwZnSfX!-FZQE5Ngs&CSi390=P-?WnrSxlWU?zb1s$bLb zir#ExOOun3kO-QMZ0`E%sZXX}m0zR-UKBMSURfFZnM@$afytfa>C>ku6L3;r<2O~1 z4n^;HX*|qrFyX0Q69E~S&)#e$Eu3{5R+kQec+auFe_tVfU6c|bXA*!Pr~9wx>VI9+ zivIGYaRgWffCwd-fItBP#PZVxB1SF zWx^o0u4_Hv9iO_L+{?Awd{=XVArQ#)g3%Y}A^BqI{DoEf8q<*!)SVZyq0V9R$Q@8l zh!qrab;PN9s&#sLTCbz$3ekYP6J}ZL%IU}xP&wd}OB3?wxI~Y)wllST*Ag8YYxMQ& zTc}C@)Krci-~g^K=(75P`f#WvI3#+cWJ>L+oc>wGBbWRPZ{^7uE`I(wz)2>*&#YoP z38A;PAFs+i$(6|sHH@y;zOb!zcbujy6w`c{P&S%a^p@2~{j96miHXnPtvAUrT z0ZE84c|(E@gB;d+I0KtixwFM1UZDF54uyaJ{xN?fHE;BHtHmS$A}I!j6KDxSjqA<^ zT4mVT*&XGXpyWjXslwdN?Vo?WC%omgmXw!Cgl(t}6$8P8ezSXY(ADX7c78rv)9%hR z6Cg*m%ORp|q7wl4b_K^)abF-8cbBqzQ}~_IfVjx_x@4#%BjfExa+z*ppRGFTfV*JF zxPA(XLEwEpmtW=QaC9V%{_39%nu_$^1;^6KBQ`er2o@J%3#~rIH=Un;e17(l^sRO? z(d*ZQgzBl=vCJ$i{G=?wIiSYh@kyv#Y|)`){@9=ccpGx8Bhx4FTtq}n69?*xPq5RQIT$AmUKD%iyX?=Xs!Q;)iX3zVV0fMH;fIO=;qZeCG#ySx?UuI)4u#Z%mrWj{+d#bgObxfovx!rqz_WbziCSJ{*I=HVDysQNbhV9PIqGe`siZF9ttF{!&{o*zM z_vB=FtPk>{VI^2doRAxhFuX&`EwO0Te2sfU6Np8A<=GBZJs2Gu8ykc%(ePn)2)?Y=u`^M__e_2~w zlQeoOr@pis`&TRzAI2$iqp(t=jD>}TLBP7Vz9YE&^)=R??KpE7_ZpNFG^N*3=;)=nr7`sHF=jbf@2J7~GfNI_x zW=GcRpytLddv12xCbWu8|BqboB$VR1XIf)pW3%8QSR&OGFe3ng&6vrly9cr>BQ&V*&v!5%oDfmHqSsI5d(pLgaNG)f={@3t{2mOdfrM ziEMbdxLt-0A3uJN#({P$0E4#(+|C0NqoSgkn3xC&33-W$xxcrkU8B(RW|U)k)czl( z{U%+Z`F}F8-xv*k{+l;^^yvRpn)UzVEbjkryU*)%eKhcj3?B#AoAau>I;ZQh>t}sV z&gGsp4(wy)uR(;iHg8>JZ8gN=V10F|(8*4MP95T3#LG9c^PC^uC36mihePgqJ3lve z%^NI9g9{S>SxFZCxXd=qyA>VB!{uN)ANjscEzMfuZ$J++zVpRoF++^Z=_xPl?z~Qs z%h$Y|6Uws@V!4_cJo{4(&@JpdFOQ3_f(cq3l{4@AqzW)(`_h*)zQtZYDNn-*{oA@% z$w;U*SiWtgm731oZKvOr`9Z&uKXVT99yzdsXV@^CJ;fW%C%equ;TyVwJS!*8;U0}W zLc%^RJuoZgwhRzG>#GoqfUFL$``ok!g7n|X)GdSgZO8=_6Bx!{MPd-XtYP(Non|WF z7efBir@ddb@V?{T`GK+g&{}zQ5~@`vm&KGY&2YKOAoEQ6rl_FD$al|{WTd70W##}GAd&U-F$Bf&8kLPK&rhC6~R>=d+$VD#%mbFrx z9d=F|oLaToEkV-(Mx}*Ou?mDcV9`6PHvWnWUaD21?FfpME#5yPGXp{U8J5hHw40}h z`X~8@UHkzcF5d~d6T(tcLHY+d)aEN9NGdfhr#C5tp0`MVS_HUn4U?O)$s+eNro_Lb zxSy1nea!3!ts@p~)@G>1#fz>Fg1fWIMZE6YpO9L~_6$kcArD9(#Vf7>U^rnwnS)ER=x?_u=C62{hau!`Q808`cszk0M;M zf290uR0zEZevW;86&f5ITsfom>kjU!HcYNmi-*IK(zfHPBwZFBetX4o{l19(LBORJ zlBjngchfZvw^e@=?Jo{PS&t#_C(Q(@xD%42>+D@5H9&clmD_2ZP%yVuyDP{9n3f#T zuD{V@L4mtmPj6c?PpiHffuoXGq5B=^XW(!eyACsMBi|dO#jD^94`3jN1wR{aGxD&)#jQm2D=6cX=E6Y(ER- zBK@12n=SCJTD*^5_BP@u4X1RWBy$B*U}e<7-l&RHxpVDt~e z1#X)RnQsT(6u>Dddp=;#CjLxz*ISH8+%L&){+*N}=?He}38mOTY-?p5ofkM!(NTS-UK;Tm zF(4%cM*Oy;jGW=suDgkfjTJWhMrO&2nG;{#f7m)qi;Mfbs`bX%T278fJ9_V`v#q|~ zyz5a@k5lTC7qyO_iLo7DT%BSZ?mo&DVNUm_V_LOQQo&opnfw+~!hEjhaTIMM-0ukS z#zG$os2NvNK=OnP-*@kj)kk=rUs=1FEcD&Ax3rayFbh_oo|pu43U5PB4hY2#q&LV# zuM)qvo~INZ48R2ol1K9)JY$m^_FJm2t@w$^@E!KvJ1Vin52rJftjkN zx<-HcH@xd0^PA@q!{B$#(%xwYKcnS9UC|20pjlwE=OUg1!+sDha6oO$Pd}m}799G% z|A7lWyMhJkT6u+I1FKS^SJ-iv0urFT5jSEWB&LJHhVRFCDJLaq6u%VcyZY#>@mYfi z=_R%)jPsMtc}=QglCSyew?)slF%s>Ag0K#*g()c$5Z@lwH}$MJ-1agk$}c6b%UZ>wjg~Zv%x^sCQdE zPpNh$TG3(Oxd?RUwQ-}J4cD^+UBx8=m~5bcZ~AG3iKzG;%Xe@7tqOHw=B)B_!j;UO z_FIs5qXv^rBx4Zj81QlE=vapAZypv>n^A@UA8tkl_f1#g$j-L25~3MV#oTFVDJeOc z-(%(O3y9p|uV{ScXWpP05hc#BzI#nE-==HPgoTMkMU`I0BMr-baeVHrEfUM~CmQS7 zg9CmPuK+!k^%Q@Bqxsul%#gP7J?C4h{w5szGJV0~8eJJ}__BsSDS;F2CIzNKvM2~Q zSm^{UD5%#*(6svWge2&K0_Y=yaYw7QUs8sW3PV{(gaQ4eG(nP{gWSRt_?sfU$i(<&6tF`1lVVan^ht5|8s5>o>%xr&D`y{g ztKT7H0{?y}ihm0!utMe47X$@4J5O=@)>7MSvDzS5Z(F#ibfnr;%*;Zc_Yw~nu+xQx zyg=tK+|U@Ji0X`f)k1>%pr?-*e+*(5@T21>ii;D&93D0M15W9~U4?Xqf#Cm2?k*YB zb>3H9zHN$lMfaD&`aI964jcPkQAH-riL#DlpoekiHVC_-ijD> zqQ8*xI@M7aZ((I|_xI$DUlQ?Mku{V~+hc|0JxVMh7*Z8xz9zWBo5AV%n~ z1dO8B(vM?CxV>YZl(Z!<=K!n!?Y#eWsY@rFQN$8|8@^Z+-~vb;D2c&MuG4W3`r zXtRvo?%swY{e!_n+}Y3Od8%0_FE&T~PtoM7bLxb3!mphbg_zD;0*Rmpc|wu6xn}t0 z4t>ANVH0V9kC`dg#@oa=gDgCo9wObq zF($`|An*|wZ%D=o=@v`0r9%tI>7_#$zrYB8Sp)vP>vsB{WOlJA_euFcAe2@#SW-RE z$T-Ky#$tJ+tGb%K$aKghlNF_W(Z)P2?;nHPUpjW05mnRort*W1B*?og;xi{TubFS6 z>&D2rYW~Ms$sj%&0*vA%Twq^6XvQh*7HqSwv!%4^pKnLNXNK;aE0KMc!ZNaT>Y8nP z5dyDX_3Esx7%oi0s%{dxyJPUR)A|VrM_r2xyqyqo13kKIMMNK*NIq{T?pccL+-45v zKwBJ-=%+en%u$2~zPGz(X<8O!^qjgjzJ(%g!WO;lze5hlxX0AgT2Uu`#n+J>#%>OL z#%4xcLahN}v_o#%uCH@KLZl%F;q#{#G7heaVokdfOG3+$Olg6}>t;~a;LLYs(Z8(?tdUWaove?TVx=q8sfq_oqBqaD$AL4U&Hlu^6*p&~$KOf4 zpJYOnQ+Hj1LC3Jxt#H4VK3sxE*p^Wcr3y5)V%&HYt+Kg%M9?MRGhoHvaR#!W@i ze?~wqeYS0_jyo8=lA94uza{-f!erkTf_BkUxUES7{Dhlq4offQI zUn$_38pUbk&|a<2WM? zOw{+L-8MfqE|{pw**c)O%KGAA485amg?9&cLZl~mn{I8ErQwt4*texvJ+*wFW%?#`#2(a z<$xOE zog^n!BYtvP+!drLq_EQV{y+^hRrsSvS!qQvi{-vKut|dyBLN6Ju>J z)-==_*y=f08;+cLSybub;RJR@3%&yE4C-laEp~&~+1WZ%Y2Zj#V&uwLQvH#ytLiVt zTI0^x*2QEMIttdMFM7=f=uVhW$$SY3jNNxvg-K6&{U;gAH57*@>nqt;b{qMRWTa_4 zP~GDWbNmh6RZVg_(r-4c=!U0{Ut-o^o+1P_aBxN?+XpPQs#dle{?N>2MPQlPm*?3= z+CRZ^m1>wc>$gC~wl?~?*ddRV`4ktACoB1(V+w+888i&skshWIGJRxs8=OPi4Bvw#-WcD4F-KT zO+w+`6FX~1a`B@6(V4F6h<5Jz?LefUFAvJ5`0~rg_ERy+x=)k2p}^vScc1HNc|u0+ zoH)DkB&2Rs(3L;uD)xZ58%`PJIdeep@$NGvD<@R>#F3 zkCAz{v-lpHZ7-=NW;XiB=4kKajfI;pg;ED1y=?W4`kBxXQ1}bkNSUF+jSrL-Nl)Q6 zp67$d=ka!G3JM&4E=fclJ=gQMd~M++B%vBQr_dwy-MgTnVJ5ZHziXw|dh(nEt8Yo* z=O#>yjGCz36Ps&kwE6~b!Q8Cl;Vezts!^|&OQZz>XRHmFn0$UgY{miE>tVA|?(2Q1 zD>~T~*Q^Tb;AOU;yP$Cy8f5{JhV$(|fQ%6J-iyUvUNBe!zh(4zmi|TG1>XY;Z%pV+X*Y^#A?l|kFNY04sd3=5 zdlIiw-md^`3|Vl01Md%bghv0$*kS8TRnt_~Is#)0SIWD=p*+^Uh^!)7n`2E^f)+T|;@o_D_!SDw0w@ORB z=TKp`q)=F^-6*NEl)SuEXPwPriZm4HO`Zknlh=BztPP%Q$?h)PUzB*?v+s$LzJZQI zr~PmX0tm~yt6&6qo~}H<97*a0j_R20{7lWT^EY%5zaB)9VeL}r^1ex0Du@PmRe{Bd zR|V0v5}q04bg9$4*U_wvhOzN2;v=O+RoY`~oS+wj_k)A#3qzSgrke~@mZr4#EToJa z1!l@~`!MW@i?oswt1Nc;K>pUf@89a}W<(oq-|8MnI`F07+~Ui(DpL=2tp08v7H5BV z%I^&c8C(Of!w|+Xs+e3oO^(p+9VcPps70wgrRncZ#lmb{T-@y}PpSRS z<>nj10HjUnh1b5`_MQxRS&wk@dY~P2dODeZMiHW+q2hSb>ix8W6{VR51dwYJuHwIP z$$ns^svU`533i^I`?k`G zinlL!!70gZsSfQzo*DZEA9E9X0b|x4$wWe?DG^%j>!3Yn2)KwwQ7Wc6k#(trJxJ)2 zasuV2Q1)<=Ow~4t_k`E3stZmbL4dnaxLlfHoy*b-6~&a$Ug^)JJE@uU>+Flt>Wq=lOC5KL`#ex9_=mxmO~jApHF)t}p9r~C!$Gg>zI zsq^+Px^(Z0jFaER*l7uRn#1WU^B*P;EQ`_!y#{(-5`?^H)4k7$2`8i{UaBvUJf_#F zu+cxA<-eFm=`Fdet0Gb>iq`rX+%@F41;eTPEjh38vqiaOEKc<-V5hNa(Xy@5z-8tzYDzd}PYQLE|;cYI z&}@F`XszDUG!?NAK4ew6l*DQyelaabPP?BDUrae)DHq%aQ|^Qv z^YLtsq#jhAFTP~XFQbVd)i8kOx3`o+nGY{*C#!$Fct<=X^0(8fV@FXr?7dk!1G0&~bW~S9CIYIg!<=+6xkesh`FB77uIatt zXR%n)!q?ox{ZMrNp~?`GXJ^(|y+xLo6}oK4F9w{=IO%!ebFi~3lbJ!6AH|6`%<{Il ze?mk|TypYI%E)9McD{xOAhbf(R1A{qzmsjys>D$f3Pd!15kmS zGh+13#pSLu;XzxnR+nk#qT+ek@ad=*7&3P)8Un%tTW;#a`&wWDp3R;vGZ{kc)Nr$6 z@9gsY+BLeTgmx@ev)>VYY`UIqwn}HN3L}KdTI9m_?{*eHq`^yyOa2-OG$KR0uxvaz zEUx}8Rdo|xja1p2T^Y7oOj}iSCvX~AQbZ0&0Y{P*e)Gjso1Rg~k2+~Cs6>bpuLWPf zaTIlz>3pC zZW1-SYP!XoR9=8#w+++!445cUq^R|{y1Az62@RMSYARw~&}vJ@azM6Ux2dvMd16N% zh_T*d6ytgRsouqI>PM0-0{K7AJIJ^e3kygA#QZAq2J$)7`zXp%PEFW6o$B->3ES(r zbmnssRcyQv=%Af5p??hL)7-@Dds06Z5;Qu&y3?z5c&MFk3RJxO2SpZ19E8X0xBT!1 z3h*9QYlfuYD7?NmKThjz$6Ew69d|0{2yk!$ewwJZD5h3kdzGZ6&0KY-Ws5dY>wb|^ zztOJw;zW`S2&DXSLYSTZVrgv%O`gO5(?sWhtE_;ZaN!IB{5dRwu2DeC$Aw76w*v~nCu3oYb$s(JR{ z!;EbezdgJGAfC=WqBu`eK~0EzB*b z4a97moD=sLE%@HZp4f_4b1kjZJ$`&%-&1{b^A#VE+3+hul9rQ;^wAU%dhNB9?ZrYF zB$l4=&=8BekP&O5ovq^hR^|ZG8ev5Ss=2M>o}db@p_RKOaI{otRn!P7T&Lw$Sji*r z54Xa@O(?XlW;R#}0QdXe#yj6?O8DMdi-7lZR8&?4Ph7WR>&mx|OXJQ2sgFo3_D@eC z-hSrQ*_%r$RkE(G(R_6Ug(llCKk~?8N?>xuK}7gmMef#2?)wjl&ML?P0%&{L;(jS= zs3?usz}1mCc{!WfnkudcdC)F_$9a-{cEyB&t(UuI-vIAp#g#&);B3aNkLQP)3He~D z{dpfQ#{(AB9UMYSg@Grm$yW4peIZGPoD`K?Jh7xC!|9_gk!Hr4!{1HS_uG!wKT8F_D=wy|8C_TlLm-Js;G8{Mx)pz!di+A z2>XgU&(6t-xgzwU{MKhLzJth59NRK4Tlp%wmaF_gwK#>TPB|xgTBWdF!*TDE$=N#w zLW#Rg<)Sw@7N>tqhq?hgtk>4h&?X3kW&ZhS2!sLap@8O<<}Q|vwACsQkf`00mkmAY z!Lnj)VtIvM#vq7BfFtZhd9!(GHJA07Gh5CEo?y2lESmeNlf#V7=dJeC%!ao}VOrqP zV}235GPWbXEPKzw8J2M2MQOAw2$y=Pp0&96!pF}&d!n8vb*cHy&0e_UDz91(xI8>)H6-vph zWWQYVV>JRyU7jtWD>1~t7(?&vNJY#&HZzt{RVlh}9R^{x;TVOUm= zUvQ-YdRJT8hXEI1+KjBY{qSX{>AR^fj3PBv`=)y;fhCy;u}+ZMkWgd2ro2(nj$zu^ zPmDIL?kn<=a2=8O`gH4BrlYp7w%dLf*#E~$;D2UEEh-&@-3&h-hL*E)JBu5N3Q zF==`%GMf(`HxD4tn2jEWhdrMhpT0gWrs$Ess-KZpozx117oeXl;pTT7hd(2<&B0(eudy7Y`_H2q6q?=Mb%%4VP_htY+vcHp*4|YC53>F5^ri;9Ls(*=qD5vQgK&r zvz0AsJ|J6yZgf^+`H}n5>JH%&jA*>Zt*8$CJ}^q5(xzsI4R?4iZi|?d%{Aps7kS6@XYXVG-K9F!DYqf3bdbD{V+E0T6^*W6SD+D-s%)A9{U{7RN7|}Z6Mg`J zl79RM<&}ZS%leJ3WZ&}-*ch3X&=s=_hrbpHe(heLtdRTiwAN2=57owYpjtINgTId^ z*TO(TD)E-_<}Ps)et+DY9Q}Zg!34u$JZv_iMh@Gr$kWR%k;ey1av`QRq7DozUAaGx zcONodA5p&;1qeF5OU_PfE`=6Ti<_6OZz4*T>#yO^rhA{#^8D@+U+HkNCGWk%I__l8 zp-~f(G{&%~pdQq`4|}bN*u^Jq)ud+=usMD)0OCvLS8ft-Z<#w8`{d;SX%Jt2*<9@2 zODPI3$Zn1M-Bi$F?_i>LmFFTWg!%ypNjJ-)9gbkg5yJMquCBnteeC~6-w8cMPNUZ$m7FFkQ z!&Uj&xl*FP0LfC6d|ieg^a9}dcV25jJ;}HH*xvO$D;%F#4O8GcF18aTG5r}hs={P( z?NUvwxIHEZk;Rm^K`sp>>7!1zw(R+sUmlizzqx{a@q>Sa(Bl%yYQIT|Ep{g_@PsZ7 zt{x@;F%S>jypz1I~ z>uiyQy`@Thw7?sM`O{xkIh+-Nt0T-qlv)%L&)0$6F~*hWykE)rDsend^}HLS>u4}E zUg&SeiJocqbNB8=;bx&>R^-7Mq9%cb?DdylrN!CY8G+NSn5p-74a%tRUyFn1ICBFN z13C=!hh@(^-KyeP0H`Uxq9KGRO-8n_sS*5k!dOBqw#=}cJG&{4+2zJ_`i)!H1?E4S zx|;r;5`VIggjm~T6N|rCEY=55*AoBg31Av#WM8fyOh6}zXD4@tM#ziX&d0_XZZVXQ zsKV?{fLfqK>JDfgl;!*eIrU8w-}@?KX_0^aBGAL8v4&TjZ&;^k=A9LxryjtC&-7rC zxK`${0-FxD-UkFhY&DYPCgMX-YW1}3dE$2tf(oGMWPjYmbmm0I#}X_*Py5UAjkMorG$@_l2=B>yr6u#O9u|5IE*~? zsr-sm6cljD5>peB(qolNvIp5YXPjJ?9hg|o)Y4<%_mO6o0e{22@BJuP^>*O)UJt<( zex)Zuy%!6)GhYfX7mR=&5E0kRQ0~g9W+O$9^*a*E7u2$sEgOZu^{gE^&)4#ldJ5K> z805jjb3HNX)2oF?=kz{;Im}-I)>(`HB)DjcuaH0_rR6Qnt=O z9B;ftp0JusQdk*!9R8g$F~~8V8y`c`tfg@Aa@M754g4yCJFe4EZuKVnFQA0QYn61k3vyKHdYcKbOwIwJsnjL2qRb$HC;VpBk&5iJOz`6a{_au z2RPsgRF<$-4A}Q6Q5P2YZ*2`6*7P`fVa~|e%OY72WLWF}n>a{@g5{;wMK|5z+-uI>W%WiLFnRSph=JK4(m%K$JfHC2E+zeLNB$sUt8z@L&edQ%b|3#K zzXhK}KKsh<_bsSvE}&$uE?h!_D#VLycwp%P)}R~ei{V5Enn^&O6#4;mLI;-0>A-u19~;A@|JLCg?#3TkZ^$#rQ@v;g7o;o}=0#O-8D^g;SDUf~ zNzxA}U8OzrEcLVF3zg-}L-BYg9T24FDKQ8HMZT*flQhC{XA9n1{D6Z?MI|G{gxJ%X zzk1e7y#7zQ^%22IuiX@gs?nEMlfOw>b|{gJ?8AKb^k?*I?$zU9$=~sXKYbolnd$Ez zU#K`%k7u!R?tqGJ&tkTJVUn0i$(F2RHubZUK`G26BF6?JwbwOeD%dSS(8J9 zH>uUv5cwffcDhAjf#1oRRCLqopQJ~2c@1MKVnuCBg#fkano1ED^mOuUcSE2u~Aw-g9SNF zrgSN|?n!;EWpT}$cXB8l3H6JyB=t8ouY>6MS&&-|>Y&_75hhVOc&cAi?2ZKfajzR7 zWC42taT-&zzx4@#I1f#(`&BgP{0=DdHVd4obS#~no(9v4wkgVA1Gl6zwrM~)xw$>H z5g`RfGLCkWnRb3{0FpVs#j)W3gB=~)vb2W|!CvoGG}c8^WX&p_?G6%~O7E7CBA zf|C8~&d?BA+~B>PYZjA@^`;YSN2S|>Pj>(>Y!0BEIk;xtQ^?0dl<`;YdzBsJC~?+q z6JG(MxiDd(0YnZ|*n1EpR9Ab0$eNlOIlYij`2kaaEO7dcfAch+&ycGndWnaf+iqIR zqfG^GJZIY}h>wn~yPJ-CVw~#3j;!OzHq%kgV}8`!!b1nqu{*h0H|*TC3XXR}`pv(B z9+!2CfiU75^j(3sCuRL^L~Hgzy_~LAh<<6whw*nlwG8rNMX*wf%d;{>d!IO&>-n<7 zR?L%|Z&m|}KhwlieFjMe0mOH*y!Ef7q&gy3?gmo9>)={|Vxz9-dz3Xzi5mX>H2ZAd7?X&aqk>E>q9G_cdd+O~^w77)6x61GPZ>6GnTDEypQhz@TJ{9Ph z2=IoNeo&-pLwxU)D%@>?evpeOXw%Zh1Xz8d%6bY?$&36eFvz@PT|S;-Vo#p%Vvl>v zLuF>QHj{5ETtO<>csx1k(EKkcX^G*thMaVpESJC?J8poFLO(=--ZGfZkj@~QQ%+d! z;BY4SWjJ>31;8u%=l=pEwX8#qFUq{D6Bp#Z3`fW9^U&Hnqa}O!PX#{n96`dG*tQ=T zJHzApk&?m67sCi39vw~2^wxb=mQ*rzq}bm7%U`0-*+Jb`63AapU$v2@F8ufu1HC!d zK>hWo$#?$hGJ%VZDA8|kgC=nh206*8EhTeQI%^rGppt4(RDbr89Jp*`rIs~+1SPT} zY3h5k5+aMOiT=St&D!$~5p^7WvRRQl++azXsP3U)`JvQ-MlAWgkEylw)YQ?fSVxI1 zS*aS^DL~GvAd4o(+kDNUMdpZ9WQ<-2z`}`6NSFz(#!pTf9^@0*h)GnDFJs%8KYv)&quDKV~eB{L{q9z)HcsLR>po~=T&MnQBncqPQg2V zvo3^K&vQC&kI$Xr91%eTa+k;A#$izdGq%QS@Gw9bn~khA`W>ynTknA+R$JMD6SJxL`kFGD2Qs12dd zF3_0hT3D_wEWLKCX6G6+6=aQ10IPc=h9lS*wu+s<{XDr%G* z-SOKiXTClVSGk8Nq7~kIM@h&*f`Z(|8}Y;iQ0I2GRwiApI@}3SF?ja0K!j@!*d>M{ zuvC+*CTy0BkGPAMN72!p_$K}VQcGsv&sb@pe&wtwe0f7ZG_Y*$kmIE2VrezEI5;pl z95y=1y|K;1&ihqRoCkp*46VWlSp5`Tf9T-8k&4F99yu8l)VU%lP2&i!G7(KmPS(7s zy@*L|!4v$b{-{@r^DSK_D;I+wz_}Ai7NFs!(}wiq1xL&CTCrhch{z|JC?HHrm{_YlotITvDdRdmxi8yw<@tG-&&!6}aH@;l%49xfg@ok;nlR@BS za@_0txgka1hEN=9f>k-DNu1nMrFKEY`hw*kQlhjJ%*0->18{sLcT!`6?L@%bz|}Rv z2`1I`oMYABqPQ{kL7&&xr+~J-B{s>GuXI#_S+-sodMg=vBPjlge@B^BXXlbM4LE$P zz~p%@cm?7SQ!R;7Y`HVeiUG7d6|==JHV8!Z(fDsLo>gO`$1&<1XnndtJ-xMaR=^&U zQhu)J!V)C>Y&AO6q8Cjtb)cgLv5yH8V48W4#ZIE7(x)wzB{m?~mWl*uflm zGVuN6gG<4pnJmlQ3^c+t!7hlNPNLcU?iBVhF~=$N6;7bCfLfN8FJ&1Ua_Q$Wyfg`H zzjO<4+5D5vdt>yqpb_)Zp=3Jk*@p4?|5M#pKSb4j`x>tzp-4+BB@GhNA&gSe-2&3x zIfO`;NJ)b<3=EA3%n;IDLw7dh+e;4CHR^k99lR+(#5Xbv}@a5Aa>t6KPFMJ$oj^MCGjA-(}GH zBaGUw$>VWDOX0fa&(EJH0X!t;A5^xj>E>wrbV12uyx;Y#?kN!fT~%U-F&^3(FE-`o z#_Mf)0h5R8RO>V`Jc)>jn5y5%@?-jJaJUL4j@-uZ7l5(Sk;H6>2-`@z(QEC`WvAQXRl8_m|VyBPKIE4Jr z+S5SYTMbdB=uV{Xksj7OLP5pdjIQ-HL@jx&kKPR<9#q0!fGD zQ;BWGT|{V9QL5G0=+wC!>>K9QNj<5i=IxpX*m&+s*1X7*L1Ev0R{;OJwLG@vyx~*x zX*{$Td*kj}vu75p@Z4Pf0U9xp^iCP}f+pZO_u^Q9b&{f(k3-0wmYNO*bRUHgO|gC@ zWIQ|4d4l}_$xRLw@E9sy4+ZKJ61@qPRRF#tiEsalxr42U1+jD zoJMBH;ths&)j{X3ldZUo8UaxWSWH_a?wWP4XWY|GDh}aY6p*V!*=i5Nb3n$Ph(=)g3(K#xG<^@Tg9a zBm@KmCZ(k~DEJ;EWi(u!okoY>ZyW`X8aeqDQunlIaf#tOK%pFF@U!i4Y*pBNagag! zjCLg@9%J|a1yt8nPusuq_l>+MS~Qn;1*Aa3JI&i;E&lK1-oi%S{vY^peP0_6MLPC0 zvS0;>FkPDQkbFdg761IS zM)ws|BqDY!iHMx~pl_oRry$cJLHcZB5pwjN*Pn!J^)lbBCx_tuL^HC+;dN#BC@LL zZQ#|%Cq0sM`-^jfbA(vu2;p0k*o-*I=PC|6|rTec~SZfAluI`UCfE!S*CvCvG#SOI0p zPhDM7V#3wO)T?-SR2^>oE)EN)7}<5ZHuXD6E+Zo<-Ja9p+SS$kz^}@>weYvvCO%DH z@s|PYF))&+H&yx4<%)0?p^gp(nm&Ekww@;TLnO40*$2Uc`?vU0&zCPxy&V<~K&xn5 zb0p=4#0ycy3G~bWC_awu(qdc54LbYz6J)^;6&s3RJ$VgS1F!Iv@Puj8)v=pG8M$dq zTd$gcbBF!LoVV|5%kx8QQg*Q~Qad?SO5qIkosn7$d|AwDE-?oTk7M&%Bca4#EEW~oxzvt4&%KE;D?JWlVEr3DK`-4Hh9cEa035f6jaj*>T z8eW#WJWiR4mbZb`rJ<6|(4b?6sw3@DwLjyEn`9T5i-RsMJbM;go5R4s`IOH&!LCUk zmXBRtM!L|@M1Q8CZACz}A=l4N59Vd*lK&fFj`%Nx`A_ewo?%HpX0e9=#h9S?Z9zQN zpGuN3^D)ie5MT$AQvbk@1xdKu8>%0f%U`}UxZE%}{!2VjK@}BDcwwJe-!qVT?6Klq zJT6zgDNB&Kyhl$#^F8p&S5Z1t-RaK%fRq;oRkTrltgExtW+G&~Qu9CdchYMh69<`u z2rzoWpVOisj{G25G(-mdOAbA2P4%a4SXRYi>Not@Bj^-hmi(d#s7c5!O^E&KUiuLL zi33n^3YxIbn{%Ahvd7n3Z4ihH05gx&!om9O`E#E=pW;b^v@|R64a_xx>ns`=PuTBL z=}W@WmRT@fgf<-tf>&{<9d{F!bW=Ye{O_*5KnW-mo*?)FH1CCW0Vk2Zp7mm__u@2q zG0^c#1CZ~Zjsc-RtL?v6i+q~i8kzqZnj0rgEpqY~WgZ2L0lY?<9$&;CIJ!ApqWaHS zydfY8!Gzb|`If~Kp55{Wv^qNeuKUU~sBU8hx;sKWpBD&blsZ4|1flH@23Eco&x`qs zaqn{Oc0FMa&AJz!m8W87nWAH*k+QCmcvI=rUo*n0%FW3jU` zGcJDGy~1hZ>P4YmaXOnz<}S?}oi`f7yc|P>oS(D_yd2=(5Dxk2Qr&zX+^i-c^g~JV zN{yMQq1JvKVi9?NwweC}L-kdP)5NL$4<=0{++!TQ&xYH2TeWRSqx#^f1jw=|>AWnI zo#Ug5I}5j_5-6s^nYv@1(#Op404K>R8F* z6XJ!c9>=f z^>qNeafaQu+5qL0^%u`+nAv+Y*$|6&I_}zqcL0-}gx?EZDud=Ryu?=?+=NlYw~Ktf ztv8od8oEE86v|ar&}GWS4vf$w2{KBb{$=coqE<~f3cMfmpdRp91_Dx-vv`k2bmJW_ zGXrM{qa6KHzhh(V<8|ESZk98Q>-|_PZscMEPh^iEd9(oZE3Uh=zEApWR)#$(ebuTJ z(SiBwdvH88#g|@F&_~-SxP1%bcs|v*-IMX@FDE+`r7+7Xeku$?Cjlc0&ijogH7lK` zuOchKAxfH>XSbbNAa1ud7>8UmI@Im@gm;0+lHl3h1>QRr|44$=baeXMMOZ01?k+;0 zd*_w}c#kPX%kr?7BY^vW=k6>HI1?CN{BC%h#KE8k&!C{9YIk>~YCiB==w*Q@8(v;b z#!wPB!`@_ncx^jDQOpbW@s`54@3%GA3l(+BUtD0xd(d99%v@j6)v*Ae<~Rnk9p^8t z=g=&{(&G3sd0~dN^jnRC%=hk2X<_Sw5PSD2avB<@rgV6Zuw?0-k9>xUj@wD==Dt*?l{us6S2c_#Uq9F|amjqt z#%YMk^&U$R7r&R?Jn(LF-->`}oovKlOxh9TLaXb;4^skLnzDTp$j%XWK+9afljIcB zSQ-D zt?geUEZ2&mv_F5~cytkV+Uxf4XSK}%(2?PmVkmM!mnb`-xkX`f&yoa~^yWsP-~EPz zD(#s^6nmxjd?>tJ-JP8)Y#SMHr}5vbSa4Un7|OvjzB;Wn)1mK24ZKP*J=&A@b!Eex=d<2$e`B;tZ4Z(A}8JzLmf*gkB1iHZTMx8=8U5tMZ3{n}3 zIjz25>agWgH&i5@nWtMKkD$N^Wz21ori2aq*&{_L_A1vu{K%nhP%bJ{wwZN1F48vdW!ZVJDUVH;*fn9N zkcm8fi?X)`u3UI-AWitJlAwuVyxc}fZj7JZHOtf^!MrV6HF@JlO`WbuM7zR6lQD;L z98)WXLIpslC106+&-dJH_fWbAGvp(a6{!NFf?|BK?(EY(_h`Ns7bB{fKZh!$bCA6j znO}_5r-zoWN2w=~l*yPqYXj={Oir~f;LcfJQ*kCZC&@}R68f!qUECLuEBfe*Vln?E zXU7iNo3?UV9;=_b(Vd({3;Fx^~trpnh>Rj>Xj)xz(EpVO3-+y^jlIxU?aYj8j z>Zi1Jxb=yiII;~E%A?r>20*L z^J}k%K4b=+Y67}kuIY;r(ZpFD~(DJ_M>WS zO95ECx>MSu*ccQ7+J*-(>GidBzfss0!!5BC4r9i_1HjyQs-lQokGnB zhGO7z20vy85q*uG$FYMt6^`;n(S9vzAX?`rfkSq)caNG^RuFoZz zG{?ewx96uETvx&~*fci~c0+A@V=LkWwp#N!=6rnP6QtV96;KAk#Ia&_j{Jlq^)b@f z_|*^gu8T7_+r6mH<9rSUHA5;9-NS(${qdxHD@-{9c~ z+tsX)Kknu0&Yqs_l|kQABsQdw5$w4gItRB|Yk1eM_EL2Ky(o&kk|4Wots!dyQ2oI~ z$B#-;zSG~83ztTa(x~;p)+ltZP1tm;6#~)v7W%n@T3InF)MDc%?WgC_I=IGH& z(TA#zbxd2@%Q@ye*09S?kFvDUsPsT4KxfW)p92=n0ot9eSc0CVdq5w14spr~>Q;L#&mwd1L25*@l;$Tg4XV&lB6`os0>6 zeRb^f0|~|Kl#~$Po9Y;7UBIS_ZqBHgnZj>3=E${AxL?Ox zxQ1RNaT6IQ--y*W78P|8VwGmMLA#^0TV&PEY?`yt2taZc)(e1-4oF_&UU~G>1W8cg zjbC-{b?WO!tsB-o`)ezbukEdzp%g<36f)&NK;$L$c>6p|v6E8ZBt%W8-Fl-M#w2%wlva(WENMqR+KL2t9=a!N0`H%oe zy@>G`fY``{`*auPP3m{A7Xqmekrxa$nDQKB@1^t9L!RtraF(GPCo<$vwq-YGN^Thq^ zkT6UyEiJ8o@A(LB5=iuDR;TR| z>|0bJ*MK}yz7Iy)!{RkEV)ZkhcJ|0}dX;C2Klj*vg@*bTFX+}Cix13hrLbn>v=Js* z`4&dMQRpu;vU*4FO*<$z=;mRZWyo#NNmFrES=E)hqS=-m!-)J|^^qTb$mby4&I zIo-tJ*Fzx$7-X+4g8PN48bx-uSKr&cL54ZM-F~n58qsQsHs?XPrN6H?mL$WIu_olR z*KB`jCHM&*)7Cp^i8x6vr{`%>+8;+CG-Q}dihtqDm}*;gw*%EiuzweIlZ^4

R}h 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

%SDD7LK=bzl;h!jHJeE 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 + +```sql +ALTER INSTANCE RELOAD TLS; +``` + +## MySQL 兼容性 + +仅支持从原配置路径重加载,不支持动态修改加载路径,也不支持动态启用启动 TiDB 时未开启的 TLS 加密连接功能。 + +## 另请参阅 + +* [Enable Client TLS](/how-to/secure/enable-tls-clients.md) diff --git a/reference/tools/tidb-control.md b/reference/tools/tidb-control.md index ec7708254fd1..569ba06e3324 100644 --- a/reference/tools/tidb-control.md +++ b/reference/tools/tidb-control.md @@ -39,6 +39,9 @@ TiDB Controller 是 TiDB 的命令行工具,用于获取 TiDB 状态信息, - `--port` TiDB 服务端口 - `--pdhost` PD 服务地址 - `--pdport` PD 服务端口 +- `--ca` 连接使用的 TLS CA 文件路径 +- `--ssl-key` 连接使用的 TLS 密钥文件路径 +- `--ssl-cert` 连接使用的 TLS 证书文件路径 其中 `--pdhost` 和 `--pdport` 主要是用于 `etcd` 子命令,例如:`tidb-ctl etcd ddlinfo`。如不添加地址和端口将使用默认值,TiDB/PD 服务默认的地址是 127.0.0.1 (服务地址只能使用 IP 地址),TiDB 服务端口默认的端口是 10080,PD 服务端口默认的端口是 2379 **连接选项是全局选项,适用于以下所有命令。**