Skip to content

Commit e9dd2b4

Browse files
authored
certificate-authentication: small updates (#21067)
1 parent a71f8d1 commit e9dd2b4

File tree

1 file changed

+17
-73
lines changed

1 file changed

+17
-73
lines changed

certificate-authentication.md

Lines changed: 17 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,12 @@ TiDB 支持基于证书鉴权的登录方式。采用这种方式,TiDB 对不
2525

2626
1. 执行以下命令生成 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

4541
2. 执行以下命令生成该密钥对应的证书:
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

5347
3. 输入证书细节信息,示例如下:
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

7365
1. 执行以下命令生成服务端的密钥:
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

8171
2. 输入证书细节信息,示例如下:
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

10088
3. 执行以下命令生成服务端的 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

114100
4. 使用 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

138122
1. 执行以下命令生成客户端的密钥:
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

146128
2. 输入证书细节信息,示例如下:
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

165145
3. 执行以下命令生成客户端 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

179157
4. 执行以下命令,使用 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
206180
openssl 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

392350
1. 以替换 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

401357
2. 生成新的 CA 密钥:
402358

403-
{{< copyable "shell-regular" >}}
404-
405359
```bash
406360
sudo openssl genrsa 2048 > ca-key.pem
407361
```
408362

409363
3. 用新的密钥生成新的 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

421373
4. 生成组合 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

439389
1. 生成新的客户端 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

452400
2. 使用新的组合 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

460406
3. 让客户端使用新的客户端密钥和证书来连接 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

474418
1. 生成新的服务端 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

483425
2. 使用新的组合 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

Comments
 (0)