With an unencrypted connection between the MySQL client and the server, someone with access to the network could watch all your traffic and inspect the data being sent or received between client and server.
When you must move information over a network in a secure fashion, an unencrypted connection is unacceptable. To make any kind of data unreadable, use encryption. Encryption algorithms must include security elements to resist many kinds of known attacks such as changing the order of encrypted messages or replaying data twice.
MySQL supports encrypted connections between clients and the server using the TLS (Transport Layer Security) protocol. TLS is sometimes referred to as SSL (Secure Sockets Layer) but MySQL does not actually use the SSL protocol for encrypted connections because its encryption is weak (see Section 8.3.2, “Encrypted Connection TLS Protocols and Ciphers”).
TLS uses encryption algorithms to ensure that data received over a public network can be trusted. It has mechanisms to detect data change, loss, or replay. TLS also incorporates algorithms that provide identity verification using the X.509 standard.
X.509 makes it possible to identify someone on the Internet. In basic terms, there should be some entity called a “Certificate Authority” (or CA) that assigns electronic certificates to anyone who needs them. Certificates rely on asymmetric encryption algorithms that have two encryption keys (a public key and a secret key). A certificate owner can present the certificate to another party as proof of identity. A certificate consists of its owner's public key. Any data encrypted using this public key can be decrypted only using the corresponding secret key, which is held by the owner of the certificate.
Support for encrypted connections in MySQL is provided using OpenSSL. For information about the encryption protocols and ciphers that OpenSSL supports, see Section 8.3.2, “Encrypted Connection TLS Protocols and Ciphers”.
By default, MySQL instances link to an available installed OpenSSL
library at runtime for support of encrypted connections and other
encryption-related operations. You may compile MySQL from source and
use the WITH_SSL
CMake option to specify the path to a particular
installed OpenSSL version or an alternative OpenSSL system package.
In that case, MySQL selects that version. For instructions to do
this, see Section 2.8.6, “Configuring SSL Library Support”.
From MySQL 8.0.11 to 8.0.17, it was possible to compile MySQL using wolfSSL as an alternative to OpenSSL. As of MySQL 8.0.18, support for wolfSSL is removed and all MySQL builds use OpenSSL.
You can check what version of the OpenSSL library is in use at
runtime using the
Tls_library_version
system status
variable, which is available from MySQL 8.0.30.
If you compile MySQL with one version of OpenSSL and want to change
to a different version without recompiling, you may do this by
editing the dynamic library loader path
(LD_LIBRARY_PATH
on Unix systems or
PATH
on Windows systems). Remove the path to the
compiled version of OpenSSL, and add the path to the replacement
version, placing it before any other OpenSSL libraries on the path.
At startup, when MySQL cannot find the version of OpenSSL specified
with WITH_SSL
on the path, it
uses the first version specified on the path instead.
By default, MySQL programs attempt to connect using encryption if the server supports encrypted connections, falling back to an unencrypted connection if an encrypted connection cannot be established. For information about options that affect use of encrypted connections, see Section 8.3.1, “Configuring MySQL to Use Encrypted Connections” and Command Options for Encrypted Connections.
MySQL performs encryption on a per-connection basis, and use of
encryption for a given user can be optional or mandatory. This
enables you to choose an encrypted or unencrypted connection
according to the requirements of individual applications. For
information on how to require users to use encrypted connections,
see the discussion of the REQUIRE
clause of the
CREATE USER
statement in
Section 15.7.1.3, “CREATE USER Statement”. See also the description of the
require_secure_transport
system
variable at Section 7.1.8, “Server System Variables”
Encrypted connections can be used between source and replica servers. See Section 19.3.1, “Setting Up Replication to Use Encrypted Connections”.
For information about using encrypted connections from the MySQL C API, see Support for Encrypted Connections.
It is also possible to connect using encryption from within an SSH connection to the MySQL server host. For an example, see Section 8.3.4, “Connecting to MySQL Remotely from Windows with SSH”.