Freigeben über


Herstellen einer Verbindung mit Azure Database for MySQL – Flexible Server mit verschlüsselten Verbindungen

GILT FÜR:Azure Database for MySQL – Flexibler Server

In diesem Artikel erfahren Sie, wie Sie:

  • Konfigurieren Ihrer Instanz von Azure Database for MySQL – flexibler Server
    • Bei deaktiviertem SSL
    • Bei SSL, das mit der TLS-Version erzwungen wurde
  • Herstellen einer Verbindung mit Ihrer Instanz von Azure Database for MySQL – flexibler Server mit der mysql-Befehlszeile
    • Bei deaktivierten verschlüsselten Verbindungen
    • Bei aktivierten verschlüsselten Verbindungen
  • Überprüfen des Verschlüsselungsstatus bei Ihrer Verbindung
  • Herstellen einer Verbindung mit Ihrer Instanz von Azure DB for MySQL – flexibler Server mit verschlüsselten Verbindungen mithilfe von verschiedenen Anwendungsframeworks

Übersicht über die TLS/SSL-Unterstützung in Der Azure-Datenbank für MySQL Flexible Server

Azure Database for MySQL – flexibler Server unterstützt das Herstellen einer Verbindung zwischen Ihren Clientanwendungen und der Instanz von Azure Database for MySQL – flexibler Server über Secure Sockets Layer (SSL) mit TLS-Verschlüsselung (Transport Layer Security). TLS ist ein Standardprotokoll der Branche, das verschlüsselte Netzwerkverbindungen zwischen dem Datenbankserver und Clientanwendungen gewährleistet, sodass Sie Konformitätsanforderungen einhalten können.

Azure Database for MySQL Flexible Server unterstützt standardmäßig verschlüsselte Verbindungen mit Transport Layer Security (TLS 1.2), und alle eingehenden Verbindungen mit TLS 1.0 und TLS 1.1 werden standardmäßig verweigert. Die Erzwingung einer verschlüsselten Verbindung oder die TLS-Versionskonfiguration bei Ihrem flexiblen Server kann – wie in diesem Artikel erläutert – geändert werden.

Im Folgenden sind die verschiedenen Konfigurationen von SSL- und TLS-Einstellungen aufgeführt, die Sie bei Ihrer Instanz von Azure Database for MySQL – flexibler Server verwenden können:

Von Bedeutung

Gemäß der Entfernung des Supports für die TLS 1.0- und TLS 1.1-Protokolle haben wir zuvor geplant, TLS 1.0 und 1.1 bis September 2024 vollständig zu beenden. Aufgrund von Abhängigkeiten, die von einigen Kunden identifiziert wurden, haben wir uns jedoch entschieden, die Zeitachse zu erweitern.

Ab dem 31. August 2025 haben wir das erzwungene Upgrade für alle Server begonnen, die weiterhin TLS 1.0 oder 1.1 verwenden. Nach diesem Datum können alle Verbindungen, die auf TLS 1.0 oder 1.1 basieren, jederzeit nicht mehr funktionieren. Um potenzielle Dienstunterbrechungen zu vermeiden, empfehlen wir dringend, dass Kunden ihre Migration zu TLS 1.2 vor dem 31. August 2025 abschließen.

Scenario Einstellungen für Serverparameter Description
Deaktivieren der TLS-Erzwingung require_secure_transport = OFF Wenn Ihre Legacyanwendung verschlüsselte Verbindungen nicht unterstützt, können Sie die Erzwingung verschlüsselter Verbindungen deaktivieren.
Durchsetzen von TLS mit TLS-Version < 1.2 (September 2024 eingestellt) require_secure_transport = ON und tls_version = TLS 1.0 oder TLS 1.1 Nicht mehr verfügbar!
Erzwingen von TLS mit TLS-Version = 1.2(Standardkonfiguration) require_secure_transport = ON und tls_version = TLS 1.2 Standardkonfiguration.
TLS mit TLS-Version 1.3 erzwingen require_secure_transport = ON und tls_version = TLS 1.3 Empfohlene Konfiguration; wird nur mit Azure Database für MySQL Flexible Server Version v8.0 und höher unterstützt.

Hinweis

Änderungen an TLS-Verschlüsselung werden nicht unterstützt. FIPS-kompatible Cipher-Suiten werden standardmäßig erzwungen, wenn tls_version auf TLS 1.2 oder TLS 1.3 gesetzt ist.

Deaktivieren der TLS-Erzwingung in Ihrer Azure-Datenbank für MySQL Flexible Server-Instanz

Wenn Ihre Clientanwendung keine verschlüsselten Verbindungen unterstützt, müssen Sie die Erzwingung von verschlüsselten Verbindungen auf Ihrer Instanz von Azure Database for MySQL – flexibler Server deaktivieren. Zum Deaktivieren der Erzwingung von verschlüsselten Verbindungen müssen Sie den Serverparameter „require_secure_transport“ auf „OFF“ festlegen, wie im Screenshot gezeigt wird, und die Konfiguration dafür speichern, damit sie wirksam wird. „require_secure_transport“ ist ein dynamischer Serverparameter, der sofort wirksam wird und dafür keinen Serverneustart erfordert.

Screenshot, der zeigt, wie SSL mit Azure Database für MySQL – flexible Server deaktiviert wird.

Herstellen einer Verbindung mit mysql-Befehlszeilenclient mit deaktivierter TLS-Funktion

Das folgende Beispiel zeigt, wie Sie einen Server mithilfe der mysql-Befehlszeilenschnittstelle verbinden können. Verwenden Sie die Einstellung --ssl-mode=DISABLED der Verbindungszeichenfolge, um die TLS/SSL-Verbindung über den mysql-Client zu deaktivieren. Ersetzen Sie die Werte durch den tatsächlichen Servernamen und das Kennwort.

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

Von Bedeutung

Wenn Sie auf der Instanz von Azure Database for MySQL Flexible Server require_secure_transport auf OFF festlegen, wird dies auch akzeptiert, wenn die Verbindung zum Client über eine verschlüsselte Verbindung erfolgt.

 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) |

Zusammenfassend lockert require_secure_transport=OFF die Durchsetzung verschlüsselter Verbindungen; daher akzeptiert der Server sowohl unverschlüsselte als auch verschlüsselte Verbindungen.

TLS-Version erzwingen

Um TLS-Versionen in Ihrer Azure-Datenbank für mySQL Flexible Server-Instanz festzulegen, müssen Sie den Serverparameter festlegen tls_version . Die Standardeinstellung für das TLS-Protokoll ist TLS 1.2. Wenn Ihre Anwendung Verbindungen mit MySQL-Server mit TLS unterstützt, aber ein anderes Protokoll als TLS 1.2 erfordert, legen Sie die TLS-Versionen im Serverparameter fest.

tls_version ist ein statischer Serverparameter , der einen Serverneustart erfordert, damit der Parameter wirksam wird.

Herstellen einer Verbindung mithilfe des mysql-Befehlszeilenclients mit TLS/SSL

Herunterladen des öffentlichen SSL-Zertifikats

Um verschlüsselte Verbindungen mit Ihren Clientanwendungen herzustellen, laden Sie das DigiCert Global Root G2-Zertifikat und das Microsoft RSA Root Certificate Authority 2017-Zertifikat herunter. Kombinieren Sie beide Zertifikate, bevor Sie eine Verbindung mit dem Server initiieren. Ausführliche Schritte finden Sie unter Aktualisieren des Stammzertifikatspeichers auf Ihrem Client

Hinweis

Sie müssen das DigiCert Global Root G2-Zertifikat für Ihre Server in der Azure Government-Cloud herunterladen.

Sie müssen DigiCert Global Root-Zertifikat für Ihre Server in Azure Mooncake herunterladen.

Speichern Sie die Zertifikatdatei am gewünschten Ort. In diesem Tutorial wird c:\ssl oder \var\www\html\bin für Ihre lokale Umgebung oder die Clientumgebung verwendet, wo die Anwendung gehostet wird.

Wenn Sie die Instanz von Azure Database for MySQL – flexibler Server mit Privater Zugriff (VNet-Integration) erstellt haben, müssen Sie eine Verbindung mit der Serverinstanz über eine Ressource innerhalb desselben virtuellen Netzwerks herstellen. Sie können einen virtuellen Computer erstellen und zum virtuellen Netzwerk hinzufügen, das mit Ihrer Instanz von Azure Database for MySQL – flexibler Server erstellt wurde.

Wenn Sie Ihre Instanz von Azure Database for MySQL – flexibler Server mit Öffentlicher Zugriff (zulässige IP-Adressen) erstellt haben, können Sie die lokale IP-Adresse der Liste der Firewallregeln für die Serverinstanz hinzufügen.

Sie können entweder mysql.exe oder MySQL-Workbench mit Azure Database for MySQL – Flexible Server verwenden--> wählen, um über Ihre lokale Umgebung eine Verbindung mit dem Server herzustellen.

Das folgende Beispiel zeigt, wie Sie einen Server mithilfe der mysql-Befehlszeilenschnittstelle verbinden können. Verwenden Sie die Einstellung --ssl-mode=REQUIRED für die Verbindungszeichenfolge, um die Überprüfung des TLS-/SSL-Zertifikats zu erzwingen. Übergeben Sie den Pfad der lokalen Zertifikatdatei an den Parameter --ssl-ca. Ersetzen Sie die Werte durch den tatsächlichen Servernamen und das Kennwort.

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

Hinweis

Vergewissern Sie sich, dass der Wert, den Sie an --ssl-ca übergeben haben, mit dem Dateipfad für das von Ihnen gespeicherte Zertifikat übereinstimmt. Wenn Sie eine Verbindung mit der vollständigen Überprüfung herstellen (sslmode=VERTIFY_IDENTITY), verwenden Sie \<servername\>.mysql.database.azure.com in Ihrer Verbindungszeichenfolge.

Wenn Sie versuchen, eine Verbindung mit Ihrem Server mit unverschlüsselten Verbindungen herzustellen, wird ein Fehler angezeigt, der besagt, dass Verbindungen mit unsicheren Transporten verboten sind:

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

Überprüfen der TLS-Verbindung

Führen Sie den Mysql-Befehl status aus, um zu überprüfen, ob Sie mit TLS verbunden sind:

mysql> status

Vergewissern Sie sich, dass die Verbindung verschlüsselt ist, indem Sie die Ausgabe überprüfen, die Folgendes anzeigen sollte: SSL: Verwendete Verschlüsselung ist. Diese Verschlüsselungssammlung zeigt ein Beispiel und basierend auf dem Client können Sie eine andere Verschlüsselungssammlung sehen.

Wie identifizieren Sie die TLS-Protokolle, die auf Ihrem Server konfiguriert sind?

Sie können den Befehl SHOW GLOBAL VARIABLES LIKE 'tls_version'; ausführen und den Wert überprüfen, um zu verstehen, welche Protokolle konfiguriert sind.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Wie ermitteln Sie, welches TLS-Protokoll von Ihren Clients verwendet wird, um eine Verbindung mit dem Server herzustellen ?

Führen Sie die SQL-Abfrage aus, um die in dieser Verbindung verwendete TLS-Version zu überprüfen:

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;

Herstellen einer Verbindung mit Ihrer Instanz von Azure DB for MySQL – flexibler Server mit verschlüsselten Verbindungen mithilfe von verschiedenen Anwendungsframeworks

Verbindungszeichenfolgen, die auf der Seite "Verbindungszeichenfolgen" vordefiniert sind, die für Ihren Server im Azure-Portal verfügbar sind, enthalten die erforderlichen Parameter für gemeinsame Sprachen, um eine Verbindung mit Ihrem Datenbankserver mithilfe von TLS/SSL herzustellen. Der TLS/SSL-Parameter variiert je nach Connector. Beispiel: "useSSL=true", "sslmode=required" oder "ssl_verify_cert=true" und andere Variationen.

Sie können die folgenden Codebeispiele nutzen, um in Ihrer Anwendung über TLS/SSL eine verschlüsselte Verbindung mit Ihrer Instanz von Azure Database for MySQL – flexibler Server einzurichten:

WordPress

Laden Sie das öffentliche SSL-Zertifikat herunter, und fügen Sie die folgenden Zeilen nach der Zeile // **MySQL settings - You can get this info from your web host** // in „wp-config.php“ ein.

//** 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 (mit 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'}
        }
    }
}

Rubin

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 (MySQL-Connector für 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 (MariaDB-Connector für 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;
});