From 61f8dbd8baebbd91abd443d685b301f26af1a372 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 1 Jun 2020 15:42:12 +0800 Subject: [PATCH 1/8] add `require SAN` to certificate authentication docs --- certificate-authentication.md | 39 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index f055865daf81..897449852001 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -259,7 +259,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key ### 获取用户证书信息 -用户证书信息可由 `require subject`、`require issuer` 和 `require cipher` 来指定,用于检查 X.509 certificate attributes。 +用户证书信息可由 `require subject`、`require issuer`、`require san` 和 `require cipher` 来指定,用于检查 X.509 certificate attributes。 + `require subject`:指定用户在连接时需要提供客户端证书的 `subject` 内容。指定该选项后,不需要再配置 `require ssl` 或 x509。配置内容对应[生成客户端密钥和证书](#生成客户端密钥和证书) 中的录入信息。 @@ -274,11 +274,37 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key + `require issuer`:指定签发用户证书的 CA 证书的 `subject` 内容。配置内容对应[生成 CA 密钥和证书](#生成-ca-密钥和证书) 中的录入信息。 可以执行以下命令来获取该项的信息: - + + {{< copyable "shell-regular" >}} + ``` openssl x509 -noout -subject -in ca-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//' ``` ++ `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成 client 证书的使用的 [openssl.cnf 配置文件的 alt_names 信息](/generate-self-signed-certificates.md)。 + + 可以执行以下命令来获取该项的信息: + + {{< copyable "shell-regular" >}} + + ``` + openssl x509 -noout -ext subjectAltName -in client.crt + ``` + + `require san` 支持配置多个 Subject Alternative Name 检查项有: + + + URI + + IP + + DNS + + 多个检查项可通过逗号连接后配置,例如对用户 u1 进行以下配置 + + ```sql + create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2' + ``` + + 将只允许用户 u1 使用 URI 项为 ”spiffe://example.org/myservice1“ 或 ”spiffe://example.org/myservice2“ 且 DNS 项为 ”d1“ 的证书登录 TiDB。 + + `require cipher`:配置该项检查客户端支持的 cipher method。可以使用以下语句来查看支持的列表: {{< copyable "sql" >}} @@ -289,14 +315,14 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key ### 配置用户证书信息 -获取用户证书信息(`require subject`, `require issuer` 和 `require cipher`)后,可在创建用户、赋予权限或更改用户时配置用户证书信息。将以下命令中的 `` 替换为对应的信息。可以选择配置其中一项或多项,使用空格或 `and` 分隔。 +获取用户证书信息(`require subject`, `require issuer`、`require san` 和 `require cipher`)后,可在创建用户、赋予权限或更改用户时配置用户证书信息。将以下命令中的 `` 替换为对应的信息。可以选择配置其中一项或多项,使用空格或 `and` 分隔。 + 可以在创建用户 (`create user`) 时配置登陆时需要校验的证书信息: {{< copyable "sql" >}} ```sql - create user 'u1'@'%' require issuer '' subject '' cipher ''; + create user 'u1'@'%' require issuer '' subject '' san '' cipher ''; ``` + 可以在赋予权限 (`grant`) 时配置登陆时需要校验的证书信息: @@ -304,7 +330,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key {{< copyable "sql" >}} ```sql - grant all on *.* to 'u1'@'%' require issuer '' subject '' cipher ''; + grant all on *.* to 'u1'@'%' require issuer '' subject '' san '' cipher ''; ``` + 还可以在修改已有用户 (alter user) 时配置登陆时需要校验的证书信息: @@ -312,7 +338,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key {{< copyable "sql" >}} ```sql - alter user 'u1'@'%' require issuer '' subject '' cipher ''; + alter user 'u1'@'%' require issuer '' subject '' san '' cipher ''; ``` 配置完成后,用户在登录时 TiDB 会验证以下内容: @@ -320,6 +346,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key + 使用 SSL 登录,且证书为服务器配置的 CA 证书所签发 + 证书的 `Issuer` 信息和权限配置里的信息相匹配 + 证书的 `Subject` 信息和权限配置里的信息相匹配 ++ 证书的 `Subject Alternative Name` 信息和权限配置里的信息相匹配 全部验证通过后用户才能登录,否则会报 `ERROR 1045 (28000): Access denied` 错误。登录后,可以通过以下命令来查看当前链接是否使用证书登录、TLS 版本和 Cipher 算法。 From 7bdadf05f7c5d8f026657c95ab0eb6cd40e62070 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 1 Jun 2020 15:45:45 +0800 Subject: [PATCH 2/8] refine words --- certificate-authentication.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 897449852001..40cbf86b8419 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -283,7 +283,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key + `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成 client 证书的使用的 [openssl.cnf 配置文件的 alt_names 信息](/generate-self-signed-certificates.md)。 - 可以执行以下命令来获取该项的信息: + 可以执行以下命令来获取已生成证书中的该项的信息: {{< copyable "shell-regular" >}} @@ -291,13 +291,13 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key openssl x509 -noout -ext subjectAltName -in client.crt ``` - `require san` 支持配置多个 Subject Alternative Name 检查项有: + `require san` 目前支持的 Subject Alternative Name 检查项有: + URI + IP + DNS - 多个检查项可通过逗号连接后配置,例如对用户 u1 进行以下配置 + 多个检查项可通过逗号连接后进行配置,例如,对用户 u1 进行以下配置 ```sql create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2' From 741b3f2ab0ef369970ef0933dcd7c566bfe14a37 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 1 Jun 2020 15:49:17 +0800 Subject: [PATCH 3/8] fix lint --- certificate-authentication.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 40cbf86b8419..59c8fca10ff5 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -293,9 +293,9 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key `require san` 目前支持的 Subject Alternative Name 检查项有: - + URI - + IP - + DNS + + URI + + IP + + DNS 多个检查项可通过逗号连接后进行配置,例如,对用户 u1 进行以下配置 From daed35acadfaed7ba3f5725a4e7cba56bc0f4932 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 1 Jun 2020 15:51:13 +0800 Subject: [PATCH 4/8] fix lint --- certificate-authentication.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 59c8fca10ff5..756c6d24feeb 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -293,9 +293,9 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key `require san` 目前支持的 Subject Alternative Name 检查项有: - + URI - + IP - + DNS + - URI + - IP + - DNS 多个检查项可通过逗号连接后进行配置,例如,对用户 u1 进行以下配置 From e523d489ad91153a1515ca8d26fb5c7b80016fd8 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 1 Jun 2020 17:26:40 +0800 Subject: [PATCH 5/8] Apply suggestions from code review Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- certificate-authentication.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 756c6d24feeb..40e22af3bf95 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -283,11 +283,11 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key + `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成 client 证书的使用的 [openssl.cnf 配置文件的 alt_names 信息](/generate-self-signed-certificates.md)。 - 可以执行以下命令来获取已生成证书中的该项的信息: + 可以执行以下命令来获取已生成证书中的 `require san` 项的信息: {{< copyable "shell-regular" >}} - ``` + ```shell openssl x509 -noout -ext subjectAltName -in client.crt ``` @@ -297,13 +297,13 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key - IP - DNS - 多个检查项可通过逗号连接后进行配置,例如,对用户 u1 进行以下配置 + 多个检查项可通过逗号连接后进行配置。例如,对用户 u1 进行以下配置: ```sql create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2' ``` - 将只允许用户 u1 使用 URI 项为 ”spiffe://example.org/myservice1“ 或 ”spiffe://example.org/myservice2“ 且 DNS 项为 ”d1“ 的证书登录 TiDB。 + 以上配置只允许用户 `u1` 使用URI 项为 `spiffe://example.org/myservice1` 或 `spiffe://example.org/myservice2`、DNS 项为 `d1` 的证书登录 TiDB。 + `require cipher`:配置该项检查客户端支持的 cipher method。可以使用以下语句来查看支持的列表: From 7874822630bd2eff88a75881b08c6b5ddfb0cf40 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 1 Jun 2020 17:26:54 +0800 Subject: [PATCH 6/8] Update certificate-authentication.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- certificate-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 40e22af3bf95..81998d604d89 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -281,7 +281,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key openssl x509 -noout -subject -in ca-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//' ``` -+ `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成 client 证书的使用的 [openssl.cnf 配置文件的 alt_names 信息](/generate-self-signed-certificates.md)。 ++ `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成客户端证书使用的 [openssl.cnf 配置文件的 `alt_names` 信息](/generate-self-signed-certificates.md)。 可以执行以下命令来获取已生成证书中的 `require san` 项的信息: From b4ad3b4941eac9737e2f7e54a4a4c7f53bb4e57b Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Mon, 1 Jun 2020 17:46:53 +0800 Subject: [PATCH 7/8] add indentation --- certificate-authentication.md | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 81998d604d89..1969c468c34c 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -285,27 +285,29 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key 可以执行以下命令来获取已生成证书中的 `require san` 项的信息: - {{< copyable "shell-regular" >}} - - ```shell - openssl x509 -noout -ext subjectAltName -in client.crt - ``` + {{< copyable "shell-regular" >}} - `require san` 目前支持的 Subject Alternative Name 检查项有: + ```shell + openssl x509 -noout -ext subjectAltName -in client.crt + ``` + + `require san` 目前支持以下 `Subject Alternative Name` 检查项: - - URI - - IP - - DNS + - URI + - IP + - DNS - 多个检查项可通过逗号连接后进行配置。例如,对用户 u1 进行以下配置: + 多个检查项可通过逗号连接后进行配置。例如,对用户 `u1` 进行以下配置: + + {{< copyable "sql" >}} - ```sql - create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2' - ``` + ```sql + create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2' + ``` - 以上配置只允许用户 `u1` 使用URI 项为 `spiffe://example.org/myservice1` 或 `spiffe://example.org/myservice2`、DNS 项为 `d1` 的证书登录 TiDB。 + 以上配置只允许用户 `u1` 使用 URI 项为 `spiffe://example.org/myservice1` 或 `spiffe://example.org/myservice2`、DNS 项为 `d1` 的证书登录 TiDB。 -+ `require cipher`:配置该项检查客户端支持的 cipher method。可以使用以下语句来查看支持的列表: ++ `require cipher`:配置该项检查客户端支持的 `cipher method`。可以使用以下语句来查看支持的列表: {{< copyable "sql" >}} From 967d8af0ebdd4ddf7f63036f6ce2cbcfc6fd4267 Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Mon, 1 Jun 2020 17:51:21 +0800 Subject: [PATCH 8/8] fix CI --- certificate-authentication.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/certificate-authentication.md b/certificate-authentication.md index 1969c468c34c..35a7f616bf9e 100644 --- a/certificate-authentication.md +++ b/certificate-authentication.md @@ -274,39 +274,39 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key + `require issuer`:指定签发用户证书的 CA 证书的 `subject` 内容。配置内容对应[生成 CA 密钥和证书](#生成-ca-密钥和证书) 中的录入信息。 可以执行以下命令来获取该项的信息: - + {{< copyable "shell-regular" >}} - + ``` openssl x509 -noout -subject -in ca-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//' ``` + `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成客户端证书使用的 [openssl.cnf 配置文件的 `alt_names` 信息](/generate-self-signed-certificates.md)。 - 可以执行以下命令来获取已生成证书中的 `require san` 项的信息: - + + 可以执行以下命令来获取已生成证书中的 `require san` 项的信息: + {{< copyable "shell-regular" >}} ```shell openssl x509 -noout -ext subjectAltName -in client.crt ``` - `require san` 目前支持以下 `Subject Alternative Name` 检查项: - + + `require san` 目前支持以下 `Subject Alternative Name` 检查项: + - URI - IP - - DNS - - 多个检查项可通过逗号连接后进行配置。例如,对用户 `u1` 进行以下配置: - + - DNS + + + 多个检查项可通过逗号连接后进行配置。例如,对用户 `u1` 进行以下配置: + {{< copyable "sql" >}} - - ```sql + + ```sql create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2' - ``` - + ``` + 以上配置只允许用户 `u1` 使用 URI 项为 `spiffe://example.org/myservice1` 或 `spiffe://example.org/myservice2`、DNS 项为 `d1` 的证书登录 TiDB。 - + + `require cipher`:配置该项检查客户端支持的 `cipher method`。可以使用以下语句来查看支持的列表: {{< copyable "sql" >}}