Partager via


Se connecter à Azure Database pour MySQL - Serveur flexible en utilisant des connexions chiffrées

Dans cet article, vous allez apprendre à :

  • Configurer votre instance de Serveur flexible Azure Database pour MySQL
    • Avec SSL désactivé
    • Avec SSL appliqué à la version TLS
  • Établir une connexion à votre instance de Serveur flexible Azure Database pour MySQL à l’aide de la ligne de commande mysql
    • Avec les connexions chiffrées désactivées
    • Avec les connexions chiffrées activées
  • Vérifier l’état du chiffrement pour votre connexion
  • Établir une connexion à votre instance de Serveur flexible Azure Database pour MySQL avec des connexions chiffrées à l’aide de diverses infrastructures d’application

Vue d’ensemble de la prise en charge de TLS/SSL dans le serveur flexible Azure Database pour MySQL

Le Serveur flexible Azure Database pour MySQL prend en charge la connexion de vos applications clientes à l’instance de Serveur flexible Azure Database pour MySQL en utilisant le chiffrement SSL (Secure Sockets Layer) avec le protocole TLS (Transport Layer Security). TLS est un protocole standard qui garantit la sécurité des connexions réseau entre votre serveur de base de données et vos applications clientes, ce qui vous permet de respecter les exigences de conformité.

Le serveur flexible Azure Database pour MySQL prend en charge par défaut les connexions chiffrées à l’aide du protocole TLS 1.2 (Transport Layer Security), donc toutes les connexions entrantes qui utilisent les protocoles TLS 1.0 et TLS 1.1 sont refusées par défaut. Vous pouvez modifier la configuration de la mise en œuvre de la connexion chiffrée ou de la version TLS sur votre Serveur flexible, tel qu’abordé dans cet article.

Voici les différentes configurations des paramètres SSL et TLS possibles pour votre instance de Serveur flexible Azure Database pour MySQL :

Important

Selon la suppression de la prise en charge des protocoles TLS 1.0 et TLS 1.1, nous avons prévu précédemment de déprécier entièrement TLS 1.0 et 1.1 d’ici septembre 2024. Toutefois, en raison des dépendances identifiées par certains clients, nous avons décidé d’étendre la chronologie.

À compter du 31 août 2025, nous avons commencé la mise à niveau forcée pour tous les serveurs qui utilisent toujours TLS 1.0 ou 1.1. Après cette date, toutes les connexions qui s’appuient sur TLS 1.0 ou 1.1 peuvent cesser de fonctionner à tout moment. Pour éviter les interruptions de service potentielles, nous recommandons vivement aux clients d’effectuer leur migration vers TLS 1.2 avant le 31 août 2025.

Scénario Paramètres du serveur Descriptif
Désactiver l'application stricte de TLS require_secure_transport = OFF Si votre application héritée ne prend pas en charge les connexions chiffrées, vous pouvez désactiver l’application des connexions chiffrées.
Imposer TLS avec la version TLS < 1.2 (déconseillé en septembre 2024) require_secure_transport = ON et tls_version = TLS 1.0 ou TLS 1.1 Il n’est plus disponible !
Appliquer TLS avec TLS version = 1.2(Configuration par défaut) require_secure_transport = ON et tls_version = TLS 1.2 Configuration par défaut.
Appliquer TLS avec TLS version = 1.3 require_secure_transport = ON et tls_version = TLS 1.3 Configuration recommandée ; pris en charge uniquement avec le serveur flexible Azure Database pour MySQL version v8.0 et ultérieure.

Note

Les modifications apportées au chiffrement TLS ne sont pas prises en charge. Les suites de chiffrement conformes FIPS sont appliquées par défaut lorsque la valeur tls_version est définie TLS 1.2 ou TLS 1.3.

Désactiver l'application stricte de TLS sur votre instance de Serveur Flexible de la base de données Azure pour MySQL

Si votre application cliente ne prend pas en charge les connexions chiffrées, vous devez désactiver l’application des connexions chiffrées sur votre instance de Serveur flexible Azure Database pour MySQL. Pour désactiver la mise en œuvre des connexions chiffrées, vous devez définir le paramètre de serveur require_secure_transport sur OFF, comme indiqué dans la capture d’écran, et enregistrer la configuration du paramètre de serveur pour qu’elle prenne effet. require_secure_transport est un paramètre de serveur dynamique qui prend effet immédiatement et ne nécessite pas le redémarrage du serveur pour prendre effet.

Capture d’écran montrant comment désactiver SSL avec le Serveur flexible Azure Database pour MySQL.

Se connecter à l’aide du client de ligne de commande mysql avec TLS désactivé

L’exemple suivant montre comment vous connecter à votre serveur à l’aide de l’interface de ligne de commande mysql. Utilisez le paramètre de chaîne de connexion --ssl-mode=DISABLED pour désactiver la connexion TLS/SSL à partir du client mysql. Remplacez les valeurs par le nom et le mot de passe réels de votre serveur.

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

Important

Si vous définissez require_secure_transport à OFF sur l’instance de serveur flexible Azure Database pour MySQL, mais si le client se connecte à la connexion sécurisée, elle est acceptée quand même.

 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 résumé, require_secure_transport=OFF la définition assouplit l’application des connexions chiffrées ; par conséquent, le serveur accepte les connexions non chiffrées en plus des connexions chiffrées.

Appliquer la version TLS

Pour définir des versions TLS sur votre instance de serveur flexible Azure Database pour MySQL, vous devez définir le tls_version paramètre du serveur. Le paramètre par défaut du protocole TLS est TLS 1.2. Si votre application prend en charge les connexions au serveur MySQL avec TLS, mais nécessite un protocole autre que TLS 1.2, définissez les versions TLS dans le paramètre de serveur.

tls_version est un paramètre de serveur statique qui nécessite un redémarrage du serveur pour que le paramètre prenne effet.

Se connecter à l’aide du client de ligne de commande mysql avec le protocole TLS/SSL

Télécharger le certificat SSL public

Pour établir des connexions chiffrées avec vos applications clientes, téléchargez le certificat DigiCert Global Root G2 et le certificat Microsoft RSA Root Certificate Authority 2017. Combinez les deux certificats avant de lancer une connexion au serveur. Pour obtenir des instructions détaillées, consultez Comment mettre à jour le magasin de certificats racine sur votre client

Note

Vous devez télécharger le certificat DigiCert Global Root G2 pour vos serveurs dans le cloud Azure Government.

Vous devez télécharger le certificat DigiCert Global Root pour vos serveurs dans Azure Mooncake.

Téléchargez le fichier de certificat dans votre l’emplacement favori. Par exemple, ce didacticiel utilise c:\ssl ou \var\www\html\bin sur votre environnement local ou l’environnement client où votre application est hébergée.

Si vous avez créé votre instance de Serveur flexible Azure Database pour MySQL avec l’option Accès privé (intégration au réseau virtuel), vous devez vous connecter à votre serveur à partir d’une ressource qui se trouve au sein du même réseau virtuel que votre serveur. Vous pouvez créer une machine virtuelle et l’ajouter au réseau virtuel créé avec votre instance de Serveur flexible Azure Database pour MySQL.

Si vous avez créé votre instance de Serveur flexible Azure Database pour MySQL avec l’option Accès public (adresses IP autorisées), vous pouvez ajouter votre adresse IP locale à la liste des règles de pare-feu sur votre serveur.

Vous pouvez choisir mysql.exe ou Utiliser MySQL Workbench avec Azure Database pour MySQL – Serveur flexible -- > pour vous connecter au serveur à partir de votre environnement local.

L’exemple suivant montre comment vous connecter à votre serveur à l’aide de l’interface de ligne de commande mysql. Utilisez le paramètre de chaîne de connexion --ssl-mode=REQUIRED pour appliquer la vérification du certificat TLS/SSL. Passez le chemin d’accès du fichier de certificat local au paramètre --ssl-ca. Remplacez les valeurs par le nom et le mot de passe réels de votre serveur.

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

Note

Vérifiez que la valeur passée à --ssl-ca correspond au chemin de fichier du certificat que vous avez enregistré. Si vous vous connectez avec la vérification complète (sslmode=VERTIFY_IDENTITY), utilisez \<servername\>.mysql.database.azure.com dans votre chaîne de connexion.

Si vous essayez de vous connecter à votre serveur avec des connexions non chiffrées, vous voyez une erreur indiquant que les connexions utilisant un transport non sécurisé sont interdites :

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

Vérifier la connexion TLS

Exécutez la commande mysql status pour vérifier que vous êtes connecté à l’aide de TLS :

mysql> status

Vérifiez que la connexion est chiffrée en examinant la sortie, qui doit indiquer : SSL: Cipher in use is. Cette suite de chiffrement est un exemple basé sur le client. Celle que vous voyez peut être différente.

Comment identifier les protocoles TLS configurés sur votre serveur ?

Vous pouvez exécuter la commande SHOW GLOBAL VARIABLES LIKE 'tls_version'; et vérifier la valeur pour identifier les protocoles configurés.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Comment savoir quel protocole TLS mes clients utilisent pour se connecter au serveur ?

Pour vérifier la version TLS utilisée dans cette connexion, exécutez la requête 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;

Établir une connexion à votre instance de Serveur flexible Azure Database pour MySQL avec des connexions chiffrées à l’aide de diverses infrastructures d’application

Les chaînes de connexion prédéfinies dans la page « Chaînes de connexion » disponibles pour votre serveur dans le portail Azure incluent les paramètres requis pour les langues courantes pour se connecter à votre serveur de base de données à l’aide de TLS/SSL. Le paramètre TLS/SSL varie en fonction du connecteur. Exemples : "useSSL=true", "sslmode=required" ou "ssl_verify_cert=true" et d’autres variantes.

Pour établir une connexion chiffrée à votre instance de Serveur flexible Azure Database pour MySQL par le biais du protocole TLS/SSL à partir de votre application, reportez-vous aux exemples de code suivants :

WordPress

Téléchargez le certificat public SSL et ajoutez les lignes suivantes dans le fichier wp-config.php après la ligne // **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 (avec 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'}
        }
    }
}

Ruby

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 (connecteur MySQL pour 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 (connecteur MariaDB pour 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;
});