تكوين اتصال 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.
من مربع الحوار إعداد اتصال جديد، انتقل إلى علامة التبويب SSL.
تحديث الحقل استخدم SSL إلى Require.
في الحقل 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;
});
الخطوات التالية
- للتعرف على انتهاء صلاحية الشهادة وتدويرها، راجع وثائق تدوير الشهادة
- راجع خيارات اتصال التطبيق المختلفة بعد مكتبات الاتصال لقاعدة بيانات Azure لـMySQL