@@ -25,16 +25,12 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
2525
26261 . 执行以下命令生成 CA 密钥:
2727
28- {{< copyable "shell-regular" >}}
29-
3028 ``` bash
3129 sudo openssl genrsa 2048 > ca-key.pem
3230 ```
3331
3432 命令执行后输出以下结果:
3533
36- {{< copyable " shell-regular" > }}
37-
3834 ` ` ` bash
3935 Generating RSA private key, 2048 bit long modulus (2 primes)
4036 ....................+++++
@@ -44,16 +40,12 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
4440
45412. 执行以下命令生成该密钥对应的证书:
4642
47- {{< copyable " shell-regular" > }}
48-
4943 ` ` ` bash
5044 sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
5145 ` ` `
5246
53473. 输入证书细节信息,示例如下:
5448
55- {{< copyable " shell-regular" > }}
56-
5749 ` ` ` bash
5850 Country Name (2 letter code) [AU]:US
5951 State or Province Name (full name) [Some-State]:California
@@ -72,16 +64,12 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
7264
73651. 执行以下命令生成服务端的密钥:
7466
75- {{< copyable " shell-regular" > }}
76-
7767 ` ` ` bash
7868 sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
7969 ` ` `
8070
81712. 输入证书细节信息,示例如下:
8272
83- {{< copyable " shell-regular" > }}
84-
8573 ` ` ` bash
8674 Country Name (2 letter code) [AU]:US
8775 State or Province Name (full name) [Some-State]:California
@@ -99,8 +87,6 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
9987
100883. 执行以下命令生成服务端的 RSA 密钥:
10189
102- {{< copyable " shell-regular" > }}
103-
10490 ` ` ` bash
10591 sudo openssl rsa -in server-key.pem -out server-key.pem
10692 ` ` `
@@ -113,8 +99,6 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
11399
1141004. 使用 CA 证书签名来生成服务端的证书:
115101
116- {{< copyable " shell-regular" > }}
117-
118102 ` ` ` bash
119103 sudo openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
120104 ` ` `
@@ -137,16 +121,12 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
137121
1381221. 执行以下命令生成客户端的密钥:
139123
140- {{< copyable " shell-regular" > }}
141-
142124 ` ` ` bash
143125 sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem
144126 ` ` `
145127
1461282. 输入证书细节信息,示例如下:
147129
148- {{< copyable " shell-regular" > }}
149-
150130 ` ` ` bash
151131 Country Name (2 letter code) [AU]:US
152132 State or Province Name (full name) [Some-State]:California
@@ -164,8 +144,6 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
164144
1651453. 执行以下命令生成客户端 RSA 证书:
166146
167- {{< copyable " shell-regular" > }}
168-
169147 ` ` ` bash
170148 sudo openssl rsa -in client-key.pem -out client-key.pem
171149 ` ` `
@@ -178,8 +156,6 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
178156
1791574. 执行以下命令,使用 CA 证书签名来生成客户端证书:
180158
181- {{< copyable " shell-regular" > }}
182-
183159 ` ` ` bash
184160 sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
185161 ` ` `
@@ -194,14 +170,12 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
194170
195171 > ** 注意:**
196172 >
197- > 以上结果中,` subject` 部分后的信息会被用来在 ` require ` 中配置和要求验证。
173+ > 以上结果中,` subject` 部分后的信息会被用来在 ` REQUIRE ` 中配置和要求验证。
198174
199175# ## 验证证书
200176
201177执行以下命令验证证书:
202178
203- {{< copyable " shell-regular" > }}
204-
205179` ` ` bash
206180openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
207181` ` `
@@ -221,13 +195,11 @@ client-cert.pem: OK
221195
222196修改 TiDB 配置文件中的 `[security]` 段。这一步指定 CA 证书、服务端密钥和服务端证书存放的路径。可将 `path/to/server-cert.pem`、`path/to/server-key.pem` 和 `path/to/ca-cert.pem` 替换成实际的路径。
223197
224- {{< copyable "" >}}
225-
226- ```
198+ ```toml
227199[security]
228- ssl-cert ="path/to/server-cert.pem"
229- ssl-key ="path/to/server-key.pem"
230- ssl-ca= "path/to/ca-cert.pem"
200+ ssl-cert = "path/to/server-cert.pem"
201+ ssl-key = "path/to/server-key.pem"
202+ ssl-ca = "path/to/ca-cert.pem"
231203```
232204
233205启动 TiDB 日志。如果日志中有以下内容,即代表配置生效:
@@ -242,10 +214,8 @@ ssl-ca="path/to/ca-cert.pem"
242214
243215以 MySQL 客户端为例,可以通过指定 ` ssl-cert ` 、` ssl-key ` 、` ssl-ca ` 来使用新的 CA 证书、客户端密钥和证书:
244216
245- {{< copyable "shell-regular" >}}
246-
247217``` bash
248- mysql -utest -h0 .0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key /path/to/client-key.new.pem --ssl-ca /path/to/ca-cert.pem
218+ mysql -u test -h 0 .0.0.0 -P 4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key /path/to/client-key.new.pem --ssl-ca /path/to/ca-cert.pem
249219```
250220
251221> ** 注意:**
@@ -260,12 +230,10 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
260230
261231用户证书信息可由 ` REQUIRE SUBJECT ` 、` REQUIRE ISSUER ` 、` REQUIRE SAN ` 和 ` REQUIRE CIPHER ` 来指定,用于检查 X.509 certificate attributes。
262232
263- + ` REQUIRE SUBJECT ` :指定用户在连接时需要提供客户端证书的 ` subject ` 内容。指定该选项后,不需要再配置 ` require ssl ` 或 x509 。配置内容对应[ 生成客户端密钥和证书] ( #生成客户端密钥和证书 ) 中的录入信息。
233+ + ` REQUIRE SUBJECT ` :指定用户在连接时需要提供客户端证书的 ` subject ` 内容。指定该选项后,不需要再配置 ` REQUIRE SSL ` 或 ` REQUIRE X509 ` 。配置内容对应[ 生成客户端密钥和证书] ( #生成客户端密钥和证书 ) 中的录入信息。
264234
265235 可以执行以下命令来获取该项的信息:
266236
267- {{< copyable "shell-regular" >}}
268-
269237 ```
270238 openssl x509 -noout -subject -in client-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//'
271239 ```
@@ -274,8 +242,6 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
274242
275243 可以执行以下命令来获取该项的信息:
276244
277- {{< copyable "shell-regular" >}}
278-
279245 ```
280246 openssl x509 -noout -subject -in ca-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//'
281247 ```
@@ -284,8 +250,6 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
284250
285251 + 可以执行以下命令来获取已生成证书中的 `REQUIRE SAN` 项的信息:
286252
287- {{< copyable "shell-regular" >}}
288-
289253 ```shell
290254 openssl x509 -noout -extensions subjectAltName -in client.crt
291255 ```
@@ -298,8 +262,6 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
298262
299263 + 多个检查项可通过逗号连接后进行配置。例如,对用户 `u1` 进行以下配置:
300264
301- {{< copyable "sql" >}}
302-
303265 ```sql
304266 CREATE USER 'u1'@'%' REQUIRE SAN 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2';
305267 ```
@@ -318,16 +280,12 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
318280
319281+ 可以在创建用户 (`CREATE USER`) 时配置登录时需要校验的证书信息:
320282
321- {{< copyable "sql" >}}
322-
323283 ```sql
324284 CREATE USER 'u1'@'%' REQUIRE ISSUER '<replaceable>' SUBJECT '<replaceable>' SAN '<replaceable>' CIPHER '<replaceable>';
325285 ```
326286
327287+ 可以在修改已有用户 (`ALTER USER`) 时配置登录时需要校验的证书信息:
328288
329- {{< copyable "sql" >}}
330-
331289 ```sql
332290 ALTER USER 'u1'@'%' REQUIRE ISSUER '<replaceable>' SUBJECT '<replaceable>' SAN '<replaceable>' CIPHER '<replaceable>';
333291 ```
@@ -336,7 +294,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
336294
337295+ 使用 SSL 登录,且证书为服务器配置的 CA 证书所签发
338296+ 证书的 `issuer` 信息和权限配置里的 `REQUIRE ISSUER` 信息相匹配
339- + 证书的 `subject` 信息和权限配置里的 ` REQUIRE CIPHER` 信息相匹配
297+ + 连接使用的加密套件与 ` REQUIRE CIPHER` 中指定的套件一致。
340298+ 证书的 `Subject Alternative Name` 信息和权限配置里的 `REQUIRE SAN` 信息相匹配
341299
342300全部验证通过后用户才能登录,否则会报 `ERROR 1045 (28000): Access denied` 错误。登录后,可以通过以下命令来查看当前链接是否使用证书登录、TLS 版本和 Cipher 算法。
@@ -391,37 +349,29 @@ CA 证书是客户端和服务端相互校验的依据,所以如果需要替
391349
3923501 . 以替换 CA 密钥为例(假设 ` ca-key.pem ` 被盗),将旧的 CA 密钥和证书进行备份:
393351
394- {{< copyable "shell-regular" >}}
395-
396352 ``` bash
397353 mv ca-key.pem ca-key.old.pem && \
398354 mv ca-cert.pem ca-cert.old.pem
399355 ```
400356
4013572. 生成新的 CA 密钥:
402358
403- {{< copyable " shell-regular" > }}
404-
405359 ` ` ` bash
406360 sudo openssl genrsa 2048 > ca-key.pem
407361 ` ` `
408362
4093633. 用新的密钥生成新的 CA 证书:
410364
411- {{< copyable " shell-regular" > }}
412-
413365 ` ` ` bash
414366 sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.new.pem
415367 ` ` `
416368
417369 > ** 注意:**
418370 >
419- > 生成新的 CA 证书是为了替换密钥和证书,保证在线用户不受影响。所以以上命令中填写的附加信息必须与已配置的 ` require issuer ` 信息一致。
371+ > 生成新的 CA 证书是为了替换密钥和证书,保证在线用户不受影响。所以以上命令中填写的附加信息必须与已配置的 ` REQUIRE ISSUER ` 信息一致。
420372
4213734. 生成组合 CA 证书:
422374
423- {{< copyable " shell-regular" > }}
424-
425375 ` ` ` bash
426376 cat ca-cert.new.pem ca-cert.old.pem > ca-cert.pem
427377 ` ` `
@@ -438,31 +388,25 @@ CA 证书是客户端和服务端相互校验的依据,所以如果需要替
438388
4393891. 生成新的客户端 RSA 密钥:
440390
441- {{< copyable " shell-regular" > }}
442-
443391 ` ` ` bash
444392 sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.new.pem -out client-req.new.pem && \
445393 sudo openssl rsa -in client-key.new.pem -out client-key.new.pem
446394 ` ` `
447395
448396 > ** 注意:**
449397 >
450- > 以上命令是为了替换密钥和证书,保证在线用户不受影响,所以以上命令中填写的附加信息必须与已配置的 ` require subject ` 信息一致。
398+ > 以上命令是为了替换密钥和证书,保证在线用户不受影响,所以以上命令中填写的附加信息必须与已配置的 ` REQUIRE SUBJECT ` 信息一致。
451399
4524002. 使用新的组合 CA 证书和新 CA 密钥生成新客户端证书:
453401
454- {{< copyable " shell-regular" > }}
455-
456402 ` ` ` bash
457403 sudo openssl x509 -req -in client-req.new.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.new.pem
458404 ` ` `
459405
4604063. 让客户端使用新的客户端密钥和证书来连接 TiDB (以 MySQL 客户端为例):
461407
462- {{< copyable " shell-regular" > }}
463-
464408 ` ` ` bash
465- mysql -utest -h0 .0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key /path/to/client-key.new.pem --ssl-ca /path/to/ca-cert.pem
409+ mysql -u test -h 0 .0.0.0 -P 4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key /path/to/client-key.new.pem --ssl-ca /path/to/ca-cert.pem
466410 ` ` `
467411
468412 > ** 注意:**
@@ -473,23 +417,23 @@ CA 证书是客户端和服务端相互校验的依据,所以如果需要替
473417
4744181. 生成新的服务端 RSA 密钥:
475419
476- {{< copyable " shell-regular" > }}
477-
478420 ` ` ` bash
479421 sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.new.pem -out server-req.new.pem && \
480422 sudo openssl rsa -in server-key.new.pem -out server-key.new.pem
481423 ` ` `
482424
4834252. 使用新的组合 CA 证书和新 CA 密钥生成新服务端证书:
484426
485- {{< copyable " shell-regular" > }}
486-
487427 ` ` ` bash
488428 sudo openssl x509 -req -in server-req.new.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.new.pem
489429 ` ` `
490430
491- 3. 配置 TiDB 使用上面新生成的服务端密钥和证书并重启。参见[配置 TiDB 服务端](# 配置-tidb-服务端)。
431+ 3. 配置 TiDB 使用上面新生成的服务端密钥和证书并重启。将文件放置在[配置 TiDB 服务端](# 配置-tidb-服务端)一节中指定的目录中。
432+
433+ ` ` ` sql
434+ ALTER INSTANCE RELOAD TLS;
435+ ` ` `
492436
493437# # 基于策略的证书访问控制
494438
495- TiDB 支持基于策略的证书访问控制 (PBAC),利用底层密钥管理服务器定义的策略。这使得用户能够根据各种条件进行细粒度的访问控制,例如基于时间的策略(如证书仅在特定时间段内有效)、基于位置的策略(如限制对特定地理位置的访问)以及其他可自定义的条件,从而确保在证书管理中提供更高的安全性和灵活性。
439+ TiDB 支持基于策略的证书访问控制 (PBAC),利用底层密钥管理服务器定义的策略。这使得用户能够根据各种条件进行细粒度的访问控制,例如基于时间的策略(如证书仅在特定时间段内有效)、基于位置的策略(如限制对特定地理位置的访问)以及其他可自定义的条件,从而确保在证书管理中提供更高的安全性和灵活性。
0 commit comments