Konfigurace připojení SSL v aplikaci pro zabezpečené připojení ke službě Azure Database for MySQL

PLATÍ PRO: Jednoúčelový server Azure Database for MySQL

Důležité

Jednoúčelový server Azure Database for MySQL je na cestě vyřazení. Důrazně doporučujeme upgradovat na flexibilní server Azure Database for MySQL. Další informace o migraci na flexibilní server Azure Database for MySQL najdete v tématu Co se děje s jednoúčelovým serverem Azure Database for MySQL?

Azure Database for MySQL podporuje připojení serveru Azure Database for MySQL k klientským aplikacím pomocí protokolu SSL (Secure Sockets Layer). Díky vynucování připojení SSL mezi databázovým serverem a klientskými aplikacemi se šifruje datový proud mezi serverem a vaší aplikací, což pomáhá chránit před napadením útočníky, kteří se vydávají za prostředníky.

Krok 1: Získání certifikátu SSL

Stáhněte si certifikát potřebný ke komunikaci přes PROTOKOL SSL se serverem Azure Database for MySQL a https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem uložte soubor certifikátu na místní disk (v tomto kurzu se používá například c:\ssl). Microsoft Internet Explorer a Microsoft Edge: Po dokončení stahování přejmenujte certifikát na BaltimoreCyberTrustRoot.crt.pem.

Projděte si následující odkazy na certifikáty pro servery v suverénních cloudech: Azure Government, Microsoft Azure provozované společností 21Vianet a Azure Germany.

Krok 2: Vytvoření vazby SSL

Konkrétní programovací jazyk připojovací řetězec najdete v ukázkovém kódu níže.

Připojení pro server pomocí aplikace MySQL Workbench přes SSL

Nakonfigurujte aplikaci MySQL Workbench tak, aby se bezpečně připojila přes PROTOKOL SSL.

  1. V dialogovém okně Nastavit nový Připojení ion přejděte na kartu SSL.

  2. Aktualizujte pole Použít SSL na Vyžadovat.

  3. Do pole Soubor certifikační autority SSL zadejte umístění souboru DigiCertGlobalRootG2.crt.pem.

    Save SSL configuration

U existujících připojení můžete vytvořit vazbu SSL tak, že kliknete pravým tlačítkem myši na ikonu připojení a zvolíte upravit. Pak přejděte na kartu SSL a vytvořte vazbu souboru certifikátu.

Připojení na server pomocí rozhraní příkazového řádku MySQL přes SSL

Dalším způsobem vytvoření vazby certifikátu SSL je použití rozhraní příkazového řádku MySQL spuštěním následujících příkazů.

mysql.exe -h mydemoserver.mysql.database.azure.com -u Username@mydemoserver -p --ssl-mode=REQUIRED --ssl-ca=c:\ssl\DigiCertGlobalRootG2.crt.pem

Poznámka:

Při použití rozhraní příkazového řádku MySQL ve Windows se může zobrazit chyba SSL connection error: Certificate signature check failed. Pokud k tomu dojde, nahraďte --ssl-mode=REQUIRED --ssl-ca={filepath} parametry parametrem --ssl.

Krok 3: Vynucení připojení SSL v Azure

Pomocí webu Azure Portal

Na webu Azure Portal přejděte na server Azure Database for MySQL a potom klikněte na Připojení zabezpečení. Pomocí přepínacího tlačítka povolte nebo zakažte nastavení vynutit připojení SSL a klepněte na tlačítko Uložit. Microsoft doporučuje vždy povolit nastavení vynucení připojení SSL pro lepší zabezpečení.

Screenshot of Azure portal to Enforce SSL connections in Azure Database for MySQL

Použití Azure CLI

Parametr vynucení ssl můžete povolit nebo zakázat pomocí hodnot Povoleno nebo Zakázáno v Azure CLI.

az mysql server update --resource-group myresource --name mydemoserver --ssl-enforcement Enabled

Krok 4: Ověření připojení SSL

Spuštěním příkazu mysql status ověřte, že jste se připojili k serveru MySQL pomocí ssl:

mysql> status

Zkontrolujte výstup, který by se měl zobrazit: Šifra: Šifra, která se používá, je AES256-SHA a ověřte, že připojení je šifrované.

Ukázkový kód

Pokud chcete vytvořit zabezpečené připojení ke službě Azure Database for MySQL přes SSL z vaší aplikace, projděte si následující ukázky kódu:

Projděte si seznam kompatibilních ovladačů podporovaných službou Azure Database for MySQL.

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@mydemoserver', 'yourpassword', 'quickstartdb', 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno()) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (pomocí 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', 'username@mydemoserver', 'yourpassword', $options);

Python (MySQL Připojení or Python)

try:
    conn = mysql.connector.connect(user='myadmin@mydemoserver',
                                   password='yourpassword',
                                   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@mydemoserver',
                       password='yourpassword',
                       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@mydemoserver',
        '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@mydemoserver',
        :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@mydemoserver" , "yourpassword", "mydemoserver.mysql.database.azure.com", 'quickstartdb')
db, _ := sql.Open("mysql", connectionString)

Java (Připojení or MySQL pro Javu)

# 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@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

Java (Připojení or MariaDB pro Javu)

# 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@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

.NET (MySql Připojení or)

var builder = new MySqlConnectionStringBuilder
{
    Server = "mydemoserver.mysql.database.azure.com",
    UserID = "myadmin@mydemoserver",
    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@mydemoserver",
    password:"yourpassword",
    database:"quickstartdb",
    port:3306,
    ssl: {
        rejectUnauthorized: true,
        ca: serverCa
    }
});
conn.connect(function(err) {
  if (err) throw err;
});

Další kroky