Dela via


Konfigurera SSL-anslutning i ditt program för att säkert ansluta till Azure Database for MySQL

GÄLLER FÖR: Azure Database for MySQL – enskild server

Viktigt!

Azure Database for MySQL – enskild server är på väg att dras tillbaka. Vi rekommenderar starkt att du uppgraderar till en flexibel Azure Database for MySQL-server. Mer information om hur du migrerar till en flexibel Azure Database for MySQL-server finns i Vad händer med Azure Database for MySQL – enskild server?

Azure Database for MySQL stöder anslutning av Din Azure Database for MySQL-server till klientprogram med hjälp av SSL (Secure Sockets Layer). Framtvingande av SSL-anslutningar mellan databasservern och klientprogrammen hjälper till att skydda mot ”man in the middle”-attacker genom att kryptera dataströmmen mellan servern och programmet.

Steg 1: Hämta SSL-certifikat

Ladda ned certifikatet som behövs för att kommunicera via SSL med din Azure Database for MySQL-server från https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem och spara certifikatfilen på din lokala enhet (i den här självstudien används c:\ssl till exempel). För Microsoft Internet Explorer och Microsoft Edge: När nedladdningen har slutförts byter du namn på certifikatet till BaltimoreCyberTrustRoot.crt.pem.

Se följande länkar för certifikat för servrar i nationella moln: Azure Government, Microsoft Azure som drivs av 21Vianet och Azure Tyskland.

Steg 2: Binda SSL

Specifika programmeringsspråk anslutningssträng finns i exempelkoden nedan.

Anslut till servern med MySQL Workbench via SSL

Konfigurera MySQL Workbench att ansluta säkert via SSL.

  1. Gå till fliken SSL från dialogrutan Konfigurera ny Anslut ion.

  2. Uppdatera fältet Använd SSL till "Kräv".

  3. I fältet SSL CA File: anger du filplatsen för DigiCertGlobalRootG2.crt.pem.

    Save SSL configuration

För befintliga anslutningar kan du binda SSL genom att högerklicka på anslutningsikonen och välja redigera. Gå sedan till fliken SSL och binda certifikatfilen.

Anslut till servern med MySQL CLI via SSL

Ett annat sätt att binda SSL-certifikatet är att använda mySQL-kommandoradsgränssnittet genom att köra följande kommandon.

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

Kommentar

När du använder kommandoradsgränssnittet MySQL i Windows kan du få ett fel SSL connection error: Certificate signature check failed. Om detta inträffar ersätter du parametrarna --ssl-mode=REQUIRED --ssl-ca={filepath} med --ssl.

Steg 3: Framtvinga SSL-anslutningar i Azure

Med hjälp av Azure-portalen

Gå till Azure Database for MySQL-servern i Azure-portalen och klicka sedan på Anslut ionssäkerhet. Använd växlingsknappen för att aktivera eller inaktivera inställningen Framtvinga SSL-anslutning och klicka sedan på Spara. Microsoft rekommenderar att du alltid aktiverar inställningen Framtvinga SSL-anslutning för förbättrad säkerhet.

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

Använda Azure CLI

Du kan aktivera eller inaktivera parametern ssl-enforcement med hjälp av aktiverade respektive inaktiverade värden i Azure CLI.

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

Steg 4: Verifiera SSL-anslutningen

Kör kommandot mysql-status för att kontrollera att du har anslutit till MySQL-servern med hjälp av SSL:

mysql> status

Bekräfta att anslutningen är krypterad genom att granska utdata, vilket bör visa: SSL: Chiffer som används är AES256-SHA

Exempelkod

Information om hur du upprättar en säker anslutning till Azure Database for MySQL via SSL från ditt program finns i följande kodexempel:

Se listan över kompatibla drivrutiner som stöds av Azure Database for MySQL-tjänsten.

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 (med hjälp av 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 Anslut 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 (MySQL Anslut or 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@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

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

.NET (MySql Anslut 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;
});

Nästa steg