Enable TLS for the MySQL Client
This document describes how to enable TLS for MySQL client of the TiDB cluster on Kubernetes. To enable TLS for the MySQL client, perform the following steps:
Issue two sets of certificates: a set of server-side certificates for the TiDB server, and a set of client-side certificates for the MySQL client. Create two Secret objects,
${tidb_group_name}-tidb-server-secretand${tidb_group_name}-tidb-client-secret, respectively including these two sets of certificates.Deploy the cluster, and set the
.spec.template.spec.security.tls.mysql.enabledfield inTiDBGrouptotrue.Configure the MySQL client to use an encrypted connection.
Certificates can be issued in multiple methods. This document describes how to use the cert-manager system to issue certificates. You can also issue certificates for TiDB clusters as needed.
To renew existing TLS certificates, see Renew and Replace the TLS Certificate.
Step 1: Issue two sets of certificates for the TiDB cluster
This section describes how to issue certificates for the TiDB cluster using cert-manager.
Install
cert-manager.Refer to cert-manager installation on Kubernetes.
Create an Issuer to issue certificates for the TiDB cluster.
To configure
cert-manager, create the Issuer resources.First, create a directory to save the files that
cert-managerneeds to create certificates:mkdir -p cert-manager cd cert-managerThen, create a
tidb-server-issuer.yamlfile with the following content:apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ${cluster_name}-selfsigned-ca-issuer namespace: ${namespace} spec: selfSigned: {} --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ${cluster_name}-ca namespace: ${namespace} spec: secretName: ${cluster_name}-ca-secret commonName: "TiDB CA" isCA: true duration: 87600h # 10yrs renewBefore: 720h # 30d issuerRef: name: ${cluster_name}-selfsigned-ca-issuer kind: Issuer --- apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ${cluster_name}-cert-issuer namespace: ${namespace} spec: ca: secretName: ${cluster_name}-ca-secretThis
.yamlfile creates three objects:- An Issuer object of SelfSigned class, used to generate the CA certificate needed by the Issuer of the CA class
- A Certificate object, whose
isCais set totrue - An Issuer, used to issue TLS certificates for the TiDB server
Finally, execute the following command to create an Issuer:
kubectl apply -f tidb-server-issuer.yamlGenerate the server-side certificate.
In
cert-manager, the Certificate resource represents the certificate interface. This certificate is issued and updated by the Issuer created in Step 2.First, create a
tidb-server-cert.yamlfile with the following content:apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ${tidb_group_name}-tidb-server-secret namespace: ${namespace} spec: secretName: ${tidb_group_name}-tidb-server-secret duration: 8760h # 365d renewBefore: 360h # 15d subject: organizations: - PingCAP commonName: "TiDB" usages: - server auth dnsNames: - "${tidb_group_name}-tidb" - "${tidb_group_name}-tidb.${namespace}" - "${tidb_group_name}-tidb.${namespace}.svc" - "*.${tidb_group_name}-tidb" - "*.${tidb_group_name}-tidb.${namespace}" - "*.${tidb_group_name}-tidb.${namespace}.svc" - "*.${tidb_group_name}-tidb-peer" - "*.${tidb_group_name}-tidb-peer.${namespace}" - "*.${tidb_group_name}-tidb-peer.${namespace}.svc" ipAddresses: - 127.0.0.1 - ::1 issuerRef: name: ${cluster_name}-cert-issuer kind: Issuer group: cert-manager.io${cluster_name}is the name of the cluster.${tidb_group_name}is the name ofTiDBGroup:- Set
spec.secretNameto${tidb_group_name}-tidb-server-secret - Add
server authinusages. - Add the following six DNSs in
dnsNames. You can also add other DNSs according to your needs:${tidb_group_name}-tidb${tidb_group_name}-tidb.${namespace}${tidb_group_name}-tidb.${namespace}.svc*.${tidb_group_name}-tidb*.${tidb_group_name}-tidb.${namespace}*.${tidb_group_name}-tidb.${namespace}.svc*.${tidb_group_name}-tidb-peer*.${tidb_group_name}-tidb-peer.${namespace}*.${tidb_group_name}-tidb-peer.${namespace}.svc
- Add the following two IPs in
ipAddresses. You can also add other IPs according to your needs:127.0.0.1::1
- Add the preceding created Issuer in the
issuerRef - For other attributes, refer to cert-manager API.
Execute the following command to generate the certificate:
kubectl apply -f tidb-server-cert.yamlAfter the object is created, cert-manager generates a
${tidb_group_name}-tidb-server-secretSecret object to be used by the TiDB server.- Set
Generate the client-side certificate:
Create a
tidb-client-cert.yamlfile with the following content:apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ${tidb_group_name}-tidb-client-secret namespace: ${namespace} spec: secretName: ${tidb_group_name}-tidb-client-secret duration: 8760h # 365d renewBefore: 360h # 15d subject: organizations: - PingCAP commonName: "TiDB" usages: - client auth issuerRef: name: ${cluster_name}-cert-issuer kind: Issuer group: cert-manager.io${cluster_name}is the name of the cluster.${tidb_group_name}is the name ofTiDBGroup:- Set
spec.secretNameto${tidb_group_name}-tidb-client-secret - Add
client authinusages dnsNamesandipAddressesare not required- Add the Issuer created above in the
issuerRef - For other attributes, refer to cert-manager API
Execute the following command to generate the certificate:
kubectl apply -f tidb-client-cert.yamlAfter the object is created, cert-manager generates a
${tidb_group_name}-tidb-client-secretSecret object to be used by the TiDB client.- Set
Step 2: Deploy the TiDBGroup
The following configuration example shows how to create a TiDBGroup with MySQL TLS enabled:
apiVersion: core.pingcap.com/v1alpha1
kind: TiDBGroup
metadata:
name: tidb
spec:
cluster:
name: tls
version: v8.5.2
replicas: 1
template:
spec:
security:
tls:
mysql:
enabled: true
config: |
[security]
cluster-verify-cn = ["TiDB"]
Step 3: Configure the MySQL client to use an encrypted connection
To connect the MySQL client with the TiDB cluster, use the client-side certificate created above and take the following methods. For details, refer to Configure the MySQL client to use TLS connections.
Execute the following command to acquire the client-side certificate and connect to the TiDB server:
kubectl get secret -n ${namespace} ${tidb_group_name}-tidb-client-secret -ojsonpath='{.data.tls\.crt}' | base64 --decode > client-tls.crt
kubectl get secret -n ${namespace} ${tidb_group_name}-tidb-client-secret -ojsonpath='{.data.tls\.key}' | base64 --decode > client-tls.key
kubectl get secret -n ${namespace} ${tidb_group_name}-tidb-client-secret -ojsonpath='{.data.ca\.crt}' | base64 --decode > client-ca.crt
mysql --comments -uroot -p -P 4000 -h ${tidb_host} --ssl-cert=client-tls.crt --ssl-key=client-tls.key --ssl-ca=client-ca.crt
Finally, to verify whether TLS is successfully enabled, refer to Check whether the current connection uses encryption.