تكوين اتصال SSL في التطبيق الخاص بك للاتصال بشكل آمن بقاعدة بيانات Azure لـMySQL

ينطبق على: قاعدة بيانات Azure ل MySQL - خادم واحد

هام

قاعدة بيانات Azure لخادم MySQL الفردي على مسار الإيقاف. نوصي بشدة بالترقية إلى قاعدة بيانات Azure لخادم MySQL المرن. لمزيد من المعلومات حول الترحيل إلى خادم Azure Database for MySQL المرن، راجع ما الذي يحدث لقاعدة بيانات Azure لخادم MySQL الفردي؟

قاعدة بيانات Azure لـ MySQL يدعم ربط قاعدة بيانات Azure لخادم MySQL إلى تطبيقات العميل باستخدام طبقة مآخذ التوصيل الآمنة (SSL). يساعد فرض اتصالات SSL التي تتم بين خادم قاعدة البيانات وتطبيقات العميل في الحماية ضد «هجمات الوسطاء» عن طريق تشفير تدفق البيانات بين الخادم والتطبيق.

الخطوة 1: الحصول على شهادة SSL

تنزيل الشهادة اللازمة للاتصال عبر SSL مع قاعدة بيانات Azure لخادم MySQL من https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem واحفظ ملف الشهادة إلى محرك الأقراص المحلي لديك. (هذا البرنامج التعليمي يستخدم c:\ssl على سبيل المثال). بالنسبة إلى Microsoft Internet Explorer و Microsoft Edge: بعد اكتمال التنزيل، أعد تسمية الشهادة إلى BaltimoreCyberTrustRoot.crt.pem.

راجع الارتباطات التالية للشهادات للخوادم في السحب السيادية: Azure Government وMicrosoft Azure التي تديرها 21Vianet وAzure Germany.

الخطوة 2: ربط SSL

بالنسبة لسلاسل اتصال لغة برمجة معينة، يرجى الرجوع إلى نموذج التعليمات البرمجية أدناه.

الاتصال بالخادم باستخدام MySQL Workbench عبر SSL

تكوين MySQL Workbench للاتصال بأمان عبر SSL.

  1. من مربع الحوار إعداد اتصال جديد، انتقل إلى علامة التبويب SSL.

  2. تحديث الحقل استخدم SSL إلى Require.

  3. في الحقل SSL CA File: أدخل موقع الملف DigiCertGlobalRootG2.crt.pem.

بالنسبة للاتصالات الموجودة، يمكنك ربط SSL بالنقر بزر الماوس الأيمن فوق أيقونة الاتصال واختيار تحرير. ثم انتقل إلى علامة التبويب SSL وربط ملف الشهادة.

الاتصال بالخادم باستخدام MySQL CLI عبر SSL

هناك طريقة أخرى لربط شهادة SSL وهي استخدام واجهة سطر الأوامر MySQL عن طريق تنفيذ الأوامر التالية.

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

إشعار

عند استخدام واجهة سطر الأوامر MySQL على Windows، قد تتلقى خطأ SSL connection error: Certificate signature check failed. إذا حدث ذلك، استبدل --ssl-mode=REQUIRED --ssl-ca={filepath} المعلمات بـ--ssl.

الخطوة 3: فرض اتصالات SSL في Azure

استخدام مدخل Microsoft Azure

باستخدام مدخل Microsoft Azure، قم بزيارة قاعدة بيانات Azure لخادم MySQL، ثم انقر فوق أمان الاتصال. استخدم زر التبديل لتمكين أو تعطيل إعدادفرض اتصال SSL، ثم انقر على حفظ. توصي Microsoft دائمًا بتمكين فرض إعداد اتصال SSL لتحسين الأمان.

استخدام Azure CLI

يمكنك تمكين أو تعطيل معلمة فرضssl باستخدام تمكين أو تعطيل قيم على التوالي في واجهة سطر الأوامر الخاص بـAzure.

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

الخطوة 4: التحقق من اتصال SSL

نفذ أمر mysql stauts للتحقق من اتصالك بخادم MySQL باستخدام SSL:

mysql> status

تأكد من تشفير الاتصال من خلال مراجعة الإخراج، والذي يجب أن يظهر: SSL: التشفير قيد الاستخدام هو AES256-SHA

التعليمة البرمجية العينة

لإنشاء اتصال آمن بقاعدة بيانات Azure لـMySQL عبر SSL من التطبيق الخاص بك، راجع نماذج التعليمات البرمجية التالية:

راجع قائمة برامج التشغيل المتوافقة التي تدعمها خدمة Azure Database لـ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 (باستخدام 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 (MySQLConnector 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 لـ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 لـ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 (MySqlConnector)

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

الخطوات التالية