为 MySQL 客户端开启 TLS

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文主要描述了在 Kubernetes 上如何为 TiDB 集群的 MySQL 客户端开启 TLS。TiDB Operator 从 v1.1 开始已经支持为 Kubernetes 上 TiDB 集群开启 MySQL 客户端 TLS。开启步骤为:为 TiDB Server 颁发一套 Server 端证书,为 MySQL Client 颁发一套 Client 端证书。并创建两个 Secret 对象,Secret 名字分别为:${cluster_name}-tidb-server-secret 和 ${cluster_name}-tidb-client-secret,分别包含前面创建的两套证书;

本文主要描述了在 Kubernetes 上如何为 TiDB 集群的 MySQL 客户端开启 TLS。TiDB Operator 从 v1.1 开始已经支持为 Kubernetes 上 TiDB 集群开启 MySQL 客户端 TLS。开启步骤为:

为 TiDB Server 颁发一套 Server 端证书,为 MySQL Client 颁发一套 Client 端证书。并创建两个 Secret 对象,Secret 名字分别为:${cluster_name}-tidb-server-secret 和 ${cluster_name}-tidb-client-secret,分别包含前面创建的两套证书;
部署集群,设置 .spec.tidb.tlsClient.enabled 属性为 true;
配置 MySQL 客户端使用加密连接。
其中,颁发证书的方式有多种,本文档提供两种方式,用户也可以根据需要为 TiDB 集群颁发证书,这两种方式分别为:

使用 cfssl 系统颁发证书;
使用 cert-manager 系统颁发证书;
第一步:为 TiDB 集群颁发两套证书
使用 cfssl 系统颁发证书
首先下载 cfssl 软件并初始化证书颁发机构:

mkdir -p ~/bin
curl -s -L -o ~/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o ~/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x ~/bin/{cfssl,cfssljson}
export PATH=$PATH:~/bin

mkdir -p cfssl
cd cfssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json
在 ca-config.json 配置文件中配置 CA 选项:

{

"signing": {
    "default": {
        "expiry": "8760h"
    },
    "profiles": {
        "server": {
            "expiry": "8760h",
            "usages": [
                "signing",
                "key encipherment",
                "server auth"
            ]
        },
        "client": {
            "expiry": "8760h",
            "usages": [
                "signing",
                "key encipherment",
                "client auth"
            ]
        }
    }
}

}
您还可以修改 ca-csr.json 证书签名请求 (CSR):

{

"CN": "TiDB Server",
"key": {
    "algo": "rsa",
    "size": 2048
},
"names": [
    {
        "C": "US",
        "L": "CA",
        "O": "PingCAP",
        "ST": "Beijing",
        "OU": "TiDB"
    }
]

}
使用定义的选项生成 CA:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
生成 Server 端证书。

首先生成默认的 server.json 文件:

cfssl print-defaults csr > server.json
然后编辑这个文件,修改 CN,hosts 属性:

...

"CN": "TiDB Server",
"hosts": [
  "127.0.0.1",
  "::1",
  "${cluster_name}-tidb",
  "${cluster_name}-tidb.${namespace}",
  "${cluster_name}-tidb.${namespace}.svc",
  "*.${cluster_name}-tidb",
  "*.${cluster_name}-tidb.${namespace}",
  "*.${cluster_name}-tidb.${namespace}.svc",
  "*.${cluster_name}-tidb-peer",
  "*.${cluster_name}-tidb-peer.${namespace}",
  "*.${cluster_name}-tidb-peer.${namespace}.svc"
],

...
其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts。

最后生成 Server 端证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
生成 Client 端证书。

首先生成默认的 client.json 文件:

cfssl print-defaults csr > client.json
然后编辑这个文件,修改 CN,hosts 属性,hosts 可以留空:

...

"CN": "TiDB Client",
"hosts": [],

...
最后生成 Client 端证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client
创建 Kubernetes Secret 对象。

到这里假设你已经按照上述文档把两套证书都创建好了。通过下面的命令为 TiDB 集群创建 Secret 对象:

kubectl create secret generic ${cluster_name}-tidb-server-secret --namespace=${namespace} --from-file=tls.crt=server.pem --from-file=tls.key=server-key.pem --from-file=ca.crt=ca.pem
kubectl create secret generic ${cluster_name}-tidb-client-secret --namespace=${namespace} --from-file=tls.crt=client.pem --from-file=tls.key=client-key.pem --from-file=ca.crt=ca.pem
这样就给 Server/Client 端证书分别创建了:

一个 Secret 供 TiDB Server 启动时加载使用;
另一个 Secret 供 MySQL 客户端连接 TiDB 集群时候使用。
用户可以生成多套 Client 端证书,并且至少要生成一套 Client 证书供 TiDB Operator 内部组件访问 TiDB Server(目前有 TidbInitializer 会访问 TiDB Server 来设置密码或者一些初始化操作)。

使用 cert-manager 颁发证书
安装 cert-manager。

请参考官网安装:cert-manager installation in Kubernetes。

创建一个 Issuer 用于给 TiDB 集群颁发证书。

为了配置 cert-manager 颁发证书,必须先创建 Issuer 资源。

首先创建一个目录保存 cert-manager 创建证书所需文件:

mkdir -p cert-manager
cd cert-manager
然后创建一个 tidb-server-issuer.yaml 文件,输入以下内容:

apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: ${cluster_name}-selfsigned-ca-issuer
namespace: ${namespace}
spec:

selfSigned: {}

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-ca
namespace: ${namespace}
spec:
secretName: ${cluster_name}-ca-secret
commonName: "TiDB CA"
isCA: true
issuerRef:

name: ${cluster_name}-selfsigned-ca-issuer
kind: Issuer

apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: ${cluster_name}-tidb-issuer
namespace: ${namespace}
spec:
ca:

secretName: ${cluster_name}-ca-secret

上面的文件创建三个对象:

一个 SelfSigned 类型的 Isser 对象(用于生成 CA 类型 Issuer 所需要的 CA 证书);
一个 Certificate 对象,isCa 属性设置为 true;
一个可以用于颁发 TiDB Server TLS 证书的 Issuer。
最后执行下面的命令进行创建:

kubectl apply -f tidb-server-issuer.yaml
创建 Server 端证书。

在 cert-manager 中,Certificate 资源表示证书接口,该证书将由上面创建的 Issuer 颁发并保持更新。

首先来创建 Server 端证书,创建一个 tidb-server-cert.yaml 文件,并输入以下内容:

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-tidb-server-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-tidb-server-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:

- PingCAP

commonName: "TiDB Server"
usages:

- server auth

dnsNames:

- "${cluster_name}-tidb"
- "${cluster_name}-tidb.${namespace}"
- "${cluster_name}-tidb.${namespace}.svc"
- "*.${cluster_name}-tidb"
- "*.${cluster_name}-tidb.${namespace}"
- "*.${cluster_name}-tidb.${namespace}.svc"
- "*.${cluster_name}-tidb-peer"
- "*.${cluster_name}-tidb-peer.${namespace}"
- "*.${cluster_name}-tidb-peer.${namespace}.svc"

ipAddresses:

- 127.0.0.1
- ::1

issuerRef:

name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io

其中 ${cluster_name} 为集群的名字:

spec.secretName 请设置为 ${cluster_name}-tidb-server-secret;
usages 请添加上 server auth;
dnsNames 需要填写这 6 个 DNS,根据需要可以填写其他 DNS:
${cluster_name}-tidb
${cluster_name}-tidb.${namespace}
${cluster_name}-tidb.${namespace}.svc
*.${cluster_name}-tidb
*.${cluster_name}-tidb.${namespace}
*.${cluster_name}-tidb.${namespace}.svc
*.${cluster_name}-tidb-peer
*.${cluster_name}-tidb-peer.${namespace}
*.${cluster_name}-tidb-peer.${namespace}.svc
ipAddresses 需要填写这两个 IP ,根据需要可以填写其他 IP:
127.0.0.1
::1
issuerRef 请填写上面创建的 Issuer;
其他属性请参考 cert-manager API。
通过执行下面的命令来创建证书:

kubectl apply -f tidb-server-cert.yaml
创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-tidb-server-secret 的 Secret 对象供 TiDB Server 使用。

创建 Client 端证书。

创建一个 tidb-client-cert.yaml 文件,并输入以下内容:

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-tidb-client-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-tidb-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:

- PingCAP

commonName: "TiDB Client"
usages:

- client auth

issuerRef:

name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io

其中 ${cluster_name} 为集群的名字:

spec.secretName 请设置为 ${cluster_name}-tidb-client-secret;
usages 请添加上 client auth;
dnsNames 和 ipAddresses 不需要填写;
issuerRef 请填写上面创建的 Issuer;
其他属性请参考 cert-manager API。
通过执行下面的命令来创建证书:

kubectl apply -f tidb-client-cert.yaml
创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-tidb-client-secret 的 Secret 对象供 TiDB Client 使用。

用户可以生成多套 Client 端证书,并且至少要生成一套 Client 证书供 TiDB Operator 内部组件访问 TiDB Server(目前有 TidbInitializer 会访问 TiDB Server 来设置密码或者一些初始化操作)。

注意:

TiDB Server 的 TLS 兼容 MySQL 协议。当QQ靓号买卖证书内容发生改变后,需要管理员手动执行 SQL 语句 alter instance reload tls 进行刷新。

第二步:部署 TiDB 集群
接下来将会通过两个 CR 对象来创建一个 TiDB 集群,并且执行以下步骤:

开启 MySQL 客户端 TLS;
对集群进行初始化(这里创建了一个数据库 app)。
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
name: ${cluster_name}
namespace: ${namespace}
spec:
version: v3.1.0
timezone: UTC
pvReclaimPolicy: Retain
pd:
baseImage: pingcap/pd
replicas: 1
requests:

 storage: "1Gi"

config: {}
tikv:
baseImage: pingcap/tikv
replicas: 1
requests:

 storage: "1Gi"

config: {}
tidb:
baseImage: pingcap/tidb
replicas: 1
service:

 type: ClusterIP

config: {}
tlsClient:

 enabled: true

apiVersion: pingcap.com/v1alpha1
kind: TidbInitializer
metadata:
name: ${cluster_name}-init
namespace: ${namespace}
spec:
image: tnir/mysqlclient
cluster:
namespace: ${namespace}
name: ${cluster_name}
initSql: |-
create database app;
其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间。通过设置 spec.tidb.tlsClient.enabled 属性为 true 来开启 MySQL 客户端 TLS。

将上面文件保存为 cr.yaml,然后使用 kubectl apply -f cr.yaml 来创建 TiDB 集群。

第三步:配置 MySQL 客户端使用加密连接
可以根据官网文档提示,使用上面创建的 Client 证书,通过下面的方法连接 TiDB 集群:

获取 Client 证书的方式并连接 TiDB Server 的方法是:

kubectl get secret -n ${namespace} ${cluster_name}-tidb-client-secret -ojsonpath='{.data.tls.crt}' | base64 --decode > client-tls.crt
kubectl get secret -n ${namespace} ${cluster_name}-tidb-client-secret -ojsonpath='{.data.tls.key}' | base64 --decode > client-tls.key
kubectl get secret -n ${namespace} ${cluster_name}-tidb-client-secret -ojsonpath='{.data.ca.crt}' | base64 --decode > client-ca.crt
mysql -uroot -p -P 4000 -h ${tidb_host} --ssl-cert=client-tls.crt --ssl-key=client-tls.key --ssl-ca=client-ca.crt
最后请参考 官网文档 来验证是否正确开启了 TLS。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
|
网络协议 关系型数据库 MySQL
1.4 启动MySQL客户端程序
1.4 启动MySQL客户端程序
78 0
|
关系型数据库 MySQL 数据库
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
978 0
|
6月前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
357 1
|
2月前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
3月前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
32 2
|
3月前
|
存储 分布式计算 DataWorks
DataWorks产品使用合集之在本地客户端一直无法连接ADB MySQL,是什么原因
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——概述-MySQL的安装、启动与停止和客户端连接、关系型数据库(RDBMS)、数据模型
MySQL数据库——概述-MySQL的安装、启动与停止和客户端连接、关系型数据库(RDBMS)、数据模型
62 0
|
6月前
|
SQL 关系型数据库 MySQL
⑩⑨【Tool】MySQL常用客户端管理工具:mysql、mysqladmin、mysqlbinlog、mysqlshow、mysqldump、mysqlimport、source
⑩⑨【Tool】MySQL常用客户端管理工具:mysql、mysqladmin、mysqlbinlog、mysqlshow、mysqldump、mysqlimport、source
86 0
|
6月前
|
存储 缓存 关系型数据库
MySQL处理客户端请求
可以提高系统性能,但是也因此需要维护这块缓存而造成一些开销。比如每次都要去查询缓存中检索、请求处理完后需要更新查询缓存等。从MySQL5.7开始不推荐使用查询缓存,在MySQL8.0中查询缓存被删除。
下一篇
无影云桌面