This section discusses how to use Transport Layer Security (TLS) to encrypt connections between TiKV nodes.

Transport Layer Security

Transport Layer Security is an standard protocol for protecting networking communications from tampering or inspection. TiKV uses OpenSSL, an industry standard, to implement it’s TLS encryption.

It’s often necessary to use TLS in situations where TiKV is being deployed or accessed from outside of a secure virtual local area network (VLAN). This includes deployments which cross the WAN (the public internet), which are part of an untrusted data center network, or where other untrustworthy users or services are active.

Before you get started

Before you get started, review your infrastructure. Your organization may already use something like the Kubernetes certificates API to issue certificates. You will need the following for your deployment:

  • A Certificate Authority (CA) certificate
  • Individual unique certificates and keys for each TiKV or PD service
  • One or many certificates and keys for TiKV clients depending on your needs.

If you have these, you can skip the optional section below.

If your organization doesn’t yet have a public key infrastructure (PKI), you can create a simple Certificate Authority to issue certificates for the services in your deployment. The instructions below show you how to do this in a few quick steps:

Optional: Generate a test certificate chain

Prepare certificates for each TiKV and PD node to be involved with the cluster.

It is recommended to prepare a separate server certificate for TiKV and the Placement Driver (PD), and make sure that they can authenticate each other. The clients of TiKV and PD can share one client certificate.

You can use multiple tools to generate self-signed certificates, such as openssl, easy-rsa, and cfssl.

Here is an example of generating self-signed certificates using easyrsa:

  1. #! /bin/bash
  2. set +e
  3. mkdir -p easyrsa
  4. cd easyrsa
  5. curl -L https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz \
  6. | tar xzv --strip-components=1
  7. ./easyrsa init-pki \
  8. && ./easyrsa build-ca nopass
  9. NUM_PD_NODES=3
  10. for i in $(seq 1 $NUM_PD_NODES); do
  11. ./easyrsa gen-req pd$i nopass
  12. ./easyrsa sign-req server pd$i
  13. done
  14. NUM_TIKV_NODES=3
  15. for i in $(seq 1 $NUM_TIKV_NODES); do
  16. ./easyrsa gen-req tikv$i nopass
  17. ./easyrsa sign-req server tikv$i
  18. done
  19. ./easyrsa gen-req client nopass
  20. ./easyrsa sign-req server client

If you run this script, you’ll need to interactively answer some questions and make some confirmations. You can answer with anything for the CA common name. For the PD and TiKV nodes, use the hostnames.

If the script runs successfully, you should have something like this:

  1. $ ls easyrsa/pki/{ca.crt,issued,private}
  2. easyrsa/pki/ca.crt
  3. easyrsa/pki/issued:
  4. client.crt pd1.crt pd2.crt pd3.crt tikv1.crt tikv2.crt tikv3.crt
  5. easyrsa/pki/private:
  6. ca.key client.key pd1.key pd2.key pd3.key tikv1.key tikv2.key tikv3.key

Configure the TiKV Server Certificates

Set the certificate in TiKV configuration file:

  1. # Using empty strings here means disabling secure connections.
  2. [security]
  3. # The path to the file that contains the PEM encoding of the server’s CA certificates.
  4. ca-path = "/path/to/ca.pem"
  5. # The path to the file that contains the PEM encoding of the server’s certificate chain.
  6. cert-path = "/path/to/tikv-server-cert.pem"
  7. # The path to the file that contains the PEM encoding of the server’s private key.
  8. key-path = "/path/to/tikv-server-key.pem"
  9. # The name list used to verify the common name in client’s certificates. Verification is
  10. # not enabled if this field is empty.
  11. cert-allowed-cn = ["tikv-server", "pd-server"]

You’ll also need to change the connection URL to https:// instead of plain ip:port.

You can find all the TiKV TLS configuration options here.

Configure the PD Certificates

Set the certificate in PD configuration file:

  1. [security]
  2. # The path to the file that contains the PEM encoding of the server’s CA certificates.
  3. cacert-path = "/path/to/ca.pem"
  4. # The path to the file that contains the PEM encoding of the server’s certificate chain.
  5. cert-path = "/path/to/pd-server-cert.pem"
  6. # The path to the file that contains the PEM encoding of the server’s private key.
  7. key-path = "/path/to/pd-server-key.pem"
  8. # The name list used to verify the common name in client’s certificates. Verification is
  9. # not enabled if this field is empty.
  10. cert-allowed-cn = ["tikv-server", "pd-server"]

You’ll also need to change the connection URL to https:// instead of plain ip:port.

You can find all the PD TLS configuration options here.

Configure the Client

You need to set TLS options for TiKV Client in order to connect to the TiKV. Taking Rust Client as example, TLS option is set like this:

  1. let config = Config::new(/* ... */).with_security(
  2. // The path to the file that contains the PEM encoding of the server’s CA certificates.
  3. "/path/to/ca.pem",
  4. // The path to the file that contains the PEM encoding of the server’s certificate chain.
  5. "/path/to/client-cert.pem",
  6. // The path to the file that contains the PEM encoding of the server’s private key.
  7. "/path/to/client-key.pem"
  8. );

You’ll also need to change the connection URL to https:// instead of plain ip:port.

Currently TiKV Java Client does not support TLS.

Connecting with tikv-ctl and pd-ctl

When using pd-ctl and tikv-ctl the relevant options will need to be set:

  1. pd-ctl \
  2. --pd "https://127.0.0.1:2379" \
  3. # The path to the file that contains the PEM encoding of the server’s CA certificates.
  4. --cacert "/path/to/ca.pem" \
  5. # The path to the file that contains the PEM encoding of the server’s certificate chain.
  6. --cert "/path/to/client.pem" \
  7. # The path to the file that contains the PEM encoding of the server’s private key.
  8. --key "/path/to/client-key.pem"
  9. tikv-ctl \
  10. --host "127.0.0.1:20160" \
  11. # The path to the file that contains the PEM encoding of the server’s CA certificates.
  12. --ca-path "/path/to/ca.pem" \
  13. # The path to the file that contains the PEM encoding of the server’s certificate chain.
  14. --cert-path "/path/to/client.pem" \
  15. # The path to the file that contains the PEM encoding of the server’s private key.
  16. --key-path "/path/to/client-key.pem"