Compartir a través de


Conexión al servidor flexible de Azure Database for MySQL con conexiones cifradas

SE APLICA A: Azure Database for MySQL - Servidor flexible

En este artículo aprenderá a:

  • Configurar la instancia del Servidor flexible de Azure Database for MySQL.
    • Con SSL deshabilitado
    • Con SSL exigido con la versión de TLS
  • Conectar la instancia del Servidor flexible de Azure Database for MySQL mediante la línea de comandos de MySQL.
    • Con conexiones cifradas deshabilitadas
    • Con conexiones cifradas habilitadas
  • Comprobar el estado de cifrado de la conexión
  • Conectar la instancia del Servidor flexible de Azure Database for MySQL con conexiones cifradas mediante varios marcos de trabajo de aplicaciones

Introducción a la compatibilidad con TLS/SSL en el servidor flexible de Azure Database for MySQL

El servidor flexible de Azure Database for MySQL admite la conexión de las aplicaciones cliente a la instancia del servidor flexible de Azure Database for MySQL mediante el cifrado de la Capa de sockets seguros (SSL) con la Seguridad de la capa de transporte (TLS). TLS es un protocolo estándar del sector que garantiza conexiones de red cifradas entre el servidor de bases de datos y las aplicaciones cliente, lo que le permite ajustarse a los requisitos de cumplimiento.

De manera predeterminada, el servidor flexible de Azure Database for MySQL admite conexiones cifradas mediante la Seguridad de la capa de transporte (TLS 1.2), y todas las conexiones entrantes con TLS 1.0 y TLS 1.1 se deniegan de manera predeterminada. La obligatoriedad de conexiones cifradas o la configuración de versiones de TLS en el Servidor flexible se pueden cambiar como se indica en este artículo.

A continuación se muestran las distintas configuraciones de SSL y TLS que puede tener para la instancia de Servidor flexible de Azure Database for MySQL:

Importante

Según la eliminación de compatibilidad con los protocolos TLS 1.0 y TLS 1.1, anteriormente planeamos eliminar completamente TLS 1.0 y 1.1 para septiembre de 2024. Sin embargo, debido a las dependencias identificadas por algunos clientes, hemos decidido ampliar la escala de tiempo.

A partir del 31 de agosto de 2025, comenzamos la actualización forzada para todos los servidores que siguen usando TLS 1.0 o 1.1. Después de esta fecha, las conexiones que dependen de TLS 1.0 o 1.1 podrían dejar de funcionar en cualquier momento. Para evitar posibles interrupciones del servicio, se recomienda encarecidamente que los clientes completen su migración a TLS 1.2 antes del 31 de agosto de 2025.

Scenario Configuración de parámetros del servidor Description
Deshabilitar aplicación de TLS require_secure_transport = OFF Si su aplicación heredada no admite conexiones cifradas, puede deshabilitar la imposición de conexiones cifradas.
Aplicación de TLS con versión < 1.2 (obsoleta en septiembre de 2024) require_secure_transport = ON y tls_version = TLS 1.0 o TLS 1.1 ¡Ya no está disponible!
Aplicación de TLS con la versión de TLS = 1.2(Configuración predeterminada) require_secure_transport = ON y tls_version = TLS 1.2 Configuración predeterminada.
Aplicar TLS con la versión TLS 1.3 require_secure_transport = ON y tls_version = TLS 1.3 Configuración recomendada; Solo se admite con la versión v8.0 y posteriores del servidor flexible de Azure Database for MySQL.

Nota:

No se admiten cambios en el cifrado TLS. Los conjuntos de cifrado compatibles con FIPS se aplican de forma predeterminada cuando se establece tls_version en TLS 1.2 o TLS 1.3.

Deshabilitación del cumplimiento de TLS en la instancia del servidor flexible de Azure Database for MySQL

Si la aplicación cliente no admite conexiones cifradas, tiene que deshabilitar la obligatoriedad de conexiones cifradas en la instancia del Servidor flexible de Azure Database for MySQL. Para deshabilitar la obligatoriedad de conexiones cifradas, debe establecer el parámetro de servidor require_secure_transport en OFF, tal y como se muestra en la captura de pantalla, y guardar la configuración para que surta efecto. require_secure_transport es un parámetro de servidor dinámico que surte efecto inmediatamente sin necesidad de reiniciar el servidor.

Captura de pantalla que muestra cómo deshabilitar SSL con el Servidor flexible de Azure Database for MySQL.

Conexión mediante el cliente de línea de comandos mysql con TLS deshabilitado

En el ejemplo siguiente se muestra cómo conectarse al servidor mediante la interfaz de la línea de comandos mysql. Use la configuración de cadena de conexión --ssl-mode=DISABLED para deshabilitar la conexión TLS/SSL del cliente de MySQL. Reemplace los valores por el nombre real del servidor y la contraseña.

 mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=DISABLED

Importante

Aunque se establezca require_secure_transport a OFF en la instancia de Azure Database for MySQL Flexible Server, si el cliente se conecta con una conexión cifrada, se acepta igualmente.

 mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=REQUIRED
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show global variables like '%require_secure_transport%';
+--------------------------+-------+
| Variable_name | Value |
| +--------------------------+-------+ |
| require_secure_transport | OFF |
| +--------------------------+-------+ |
| 1 row in set (0.02 sec) |

En resumen, require_secure_transport=OFF la configuración relaja el cumplimiento de las conexiones cifradas; por lo tanto, el servidor acepta conexiones sin cifrar además de las conexiones cifradas.

Aplicación de la versión de TLS

Para establecer las versiones de TLS en la instancia de servidor flexible de Azure Database for MySQL, debe establecer tls_version el parámetro de servidor. La configuración predeterminada para el protocolo TLS es TLS 1.2. Si la aplicación admite conexiones con el servidor MySQL con TLS, pero requiere cualquier protocolo distinto de TLS 1.2, establezca las versiones de TLS en el parámetro de servidor.

tls_version es un parámetro de servidor estático que requiere un reinicio del servidor para que el parámetro surta efecto.

Conexión mediante el cliente de línea de comandos mysql con TLS/SSL

Descarga del certificado SSL público

Para establecer conexiones cifradas con las aplicaciones cliente, descargue el certificado DigiCert Global Root G2 y el certificado de la entidad de certificación raíz RSA de Microsoft 2017. Combine ambos certificados antes de iniciar una conexión con el servidor. Para obtener pasos detallados, consulte Actualización del almacén de certificados raíz en el cliente.

Nota:

Debe descargar el certificado DigiCert Global Root G2 para los servidores en la nube de Azure Government.

Debe descargar el certificado raíz global de DigiCert para los servidores en Azure Mooncake.

Guarde el archivo de certificado en la ubicación que prefiera. Por ejemplo, en este tutorial se usa c:\ssl o \var\www\html\bin en el entorno local o en el entorno cliente donde se hospeda la aplicación.

Si ha creado la instancia del Servidor flexible de Azure Database for MySQL con Acceso privado (integración con red virtual), debe conectarse al servidor desde un recurso que se encuentre en la misma red virtual que el servidor. Puede crear una máquina virtual y agregarla a la red virtual creada con la instancia del Servidor flexible de Azure Database for MySQL.

Si ha creado la instancia del Servidor flexible de Azure Database for MySQL con Acceso público (direcciones IP permitidas), puede agregar la dirección IP local a la lista de reglas de firewall del servidor.

Puede elegir mysql.exe o Usar MySQL Workbench con Azure Database for MySQL : servidorflexible,> para conectarse al servidor desde el entorno local.

En el ejemplo siguiente se muestra cómo conectarse al servidor mediante la interfaz de la línea de comandos mysql. Use la configuración de la cadena de conexión --ssl-mode=REQUIRED para aplicar la comprobación del certificado TLS/SSL. Pase la ruta de acceso al archivo del certificado local al parámetro --ssl-ca. Reemplace los valores por el nombre real del servidor y la contraseña.

sudo apt-get install mysql-client
wget --no-check-certificate https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem
mysql -h mydemoserver.mysql.database.azure.com -u mydemouser -p --ssl-mode=REQUIRED --ssl-ca=DigiCertGlobalRootG2.crt.pem

Nota:

Confirme que el valor pasado a --ssl-ca coincide con la ruta de acceso al archivo del certificado que guardó. Si se conecta con la verificación completa (sslmode=VERTIFY_IDENTITY), use \<servername\>.mysql.database.azure.com en la cadena de conexión.

Si intenta conectarse al servidor con conexiones sin cifrar, verá un error que indica que las conexiones que usan transporte no seguro están prohibidas:

ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.

Comprobación de la conexión TLS

Ejecute el comando mysql status para comprobar que está conectado mediante TLS:

mysql> status

Confirme que la conexión está cifrada; para ello, revise la salida, que debe mostrar: SSL: el cifrado en uso es. Este conjunto de cifrado muestra un ejemplo; en función del cliente, puede ver otro conjunto de cifrado.

¿Cómo identificar los protocolos TLS configurados en el servidor?

Puede ejecutar el comando SHOW GLOBAL VARIABLES LIKE 'tls_version'; y comprobar el valor para comprender qué protocolos están configurados.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Cómo saber qué protocolo TLS utilizan mis clientes para conectarse al servidor

Para comprobar la versión de TLS usada en esta conexión, ejecute la consulta SQL:

SELECT sbt.variable_value AS tls_version,  t2.variable_value AS cipher,
processlist_user AS user, processlist_host AS host
FROM performance_schema.status_by_thread  AS sbt
JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher' ORDER BY tls_version;

Conectar la instancia del Servidor flexible de Azure Database for MySQL con conexiones cifradas mediante varios marcos de trabajo de aplicaciones

Las cadenas de conexión predefinidas en la página "Cadenas de conexión" disponibles para el servidor en Azure Portal incluyen los parámetros necesarios para que los lenguajes comunes se conecten al servidor de bases de datos mediante TLS/SSL. El parámetro TLS/SSL varía en función del conector. Por ejemplo, puede ser "useSSL=true", "sslmode=required" o "ssl_verify_cert=true", entre otras variables.

Para establecer una conexión cifrada a la instancia del Servidor flexible de Azure Database for MySQL a través de TLS/SSL desde la aplicación, consulte los ejemplos de código siguientes:

WordPress

Descargue el certificado SSL público y agregue las siguientes líneas en wp-config.php después de la línea // **MySQL settings - You can get this info from your web host** //.

//** Connect with SSL ** //
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
//** SSL CERT **//
define('MYSQL_SSL_CERT','/FULLPATH/on-client/to/DigiCertGlobalRootG2.crt.pem');

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/DigiCertGlobalRootG2.crt.pem", NULL, NULL);
mysqli_real_connect($conn, 'mydemoserver.mysql.database.azure.com', 'myadmin', 'yourpassword', 'quickstartdb', 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno()) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (mediante PDO)

$options = array(
    PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/DigiCertGlobalRootG2.crt.pem'
);
$db = new PDO('mysql:host=mydemoserver.mysql.database.azure.com;port=3306;dbname=databasename', 'myadmin', 'yourpassword', $options);

Python (MySQLConnector Python)

try:
    conn = mysql.connector.connect(user='myadmin',
                                   password='<password>',
                                   database='quickstartdb',
                                   host='mydemoserver.mysql.database.azure.com',
                                   ssl_ca='/var/www/html/DigiCertGlobalRootG2.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)

conn = pymysql.connect(user='myadmin',
                       password='<password>',
                       database='quickstartdb',
                       host='mydemoserver.mysql.database.azure.com',
                       ssl={'ca': '/var/www/html/DigiCertGlobalRootG2.crt.pem'})

Django (PyMySQL)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'quickstartdb',
        'USER': 'myadmin',
        'PASSWORD': 'yourpassword',
        'HOST': 'mydemoserver.mysql.database.azure.com',
        'PORT': '3306',
        'OPTIONS': {
            'ssl': {'ca': '/var/www/html/DigiCertGlobalRootG2.crt.pem'}
        }
    }
}

Rubí

client = Mysql2::Client.new(
        :host     => 'mydemoserver.mysql.database.azure.com',
        :username => 'myadmin',
        :password => 'yourpassword',
        :database => 'quickstartdb',
        :sslca => '/var/www/html/DigiCertGlobalRootG2.crt.pem'
    )

Golang

rootCertPool := x509.NewCertPool()
pem, _ := ioutil.ReadFile("/var/www/html/DigiCertGlobalRootG2.crt.pem")
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
    log.Fatal("Failed to append PEM.")
}
mysql.RegisterTLSConfig("custom", &tls.Config{RootCAs: rootCertPool})
var connectionString string
connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true&tls=custom",'myadmin' , 'yourpassword', 'mydemoserver.mysql.database.azure.com', 'quickstartdb')
db, _ := sql.Open("mysql", connectionString)

Java (conector de MySQL para Java)

# generate truststore and keystore in code

String importCert = " -import "+
    " -alias mysqlServerCACert "+
    " -file " + ssl_ca +
    " -keystore truststore "+
    " -trustcacerts " +
    " -storepass password -noprompt ";
String genKey = " -genkey -keyalg rsa " +
    " -alias mysqlClientCertificate -keystore keystore " +
    " -storepass password123 -keypass password " +
    " -dname CN=MS ";
sun.security.tools.keytool.Main.main(importCert.trim().split("\\s+"));
sun.security.tools.keytool.Main.main(genKey.trim().split("\\s+"));

# use the generated keystore and truststore

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

url = String.format("jdbc:mysql://%s/%s?serverTimezone=UTC&useSSL=true", 'mydemoserver.mysql.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

Java (conector de MariaDB para Java)

# generate truststore and keystore in code

String importCert = " -import "+
    " -alias mysqlServerCACert "+
    " -file " + ssl_ca +
    " -keystore truststore "+
    " -trustcacerts " +
    " -storepass password -noprompt ";
String genKey = " -genkey -keyalg rsa " +
    " -alias mysqlClientCertificate -keystore keystore " +
    " -storepass password123 -keypass password " +
    " -dname CN=MS ";
sun.security.tools.keytool.Main.main(importCert.trim().split("\\s+"));
sun.security.tools.keytool.Main.main(genKey.trim().split("\\s+"));

# use the generated keystore and truststore

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

url = String.format("jdbc:mariadb://%s/%s?useSSL=true&trustServerCertificate=true", 'mydemoserver.mysql.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

.NET (MySqlConnector)

var builder = new MySqlConnectionStringBuilder
{
    Server = "mydemoserver.mysql.database.azure.com",
    UserID = "myadmin",
    Password = "yourpassword",
    Database = "quickstartdb",
    SslMode = MySqlSslMode.VerifyCA,
    SslCa = "DigiCertGlobalRootG2.crt.pem",
};
using (var connection = new MySqlConnection(builder.ConnectionString))
{
    connection.Open();
}

Node.js.

var fs = require('fs');
var mysql = require('mysql');
const serverCa = [fs.readFileSync("/var/www/html/DigiCertGlobalRootG2.crt.pem", "utf8")];
var conn=mysql.createConnection({
    host:"mydemoserver.mysql.database.azure.com",
    user:"myadmin",
    password:"yourpassword",
    database:"quickstartdb",
    port:3306,
    ssl: {
        rejectUnauthorized: true,
        ca: serverCa
    }
});
conn.connect(function(err) {
  if (err) throw err;
});