Konfigurowanie łączności SSL w aplikacji w celu bezpiecznego nawiązywania połączeń z usługą Azure Database for MySQL
DOTYCZY: Azure Database for MySQL — pojedynczy serwer
Ważne
Pojedynczy serwer usługi Azure Database for MySQL znajduje się na ścieżce wycofania. Zdecydowanie zalecamy uaktualnienie do serwera elastycznego usługi Azure Database for MySQL. Aby uzyskać więcej informacji na temat migracji do serwera elastycznego usługi Azure Database for MySQL, zobacz Co się dzieje z usługą Azure Database for MySQL — pojedynczy serwer?
Usługa Azure Database for MySQL obsługuje łączenie serwera usługi Azure Database for MySQL z aplikacjami klienckimi przy użyciu protokołu SSL (Secure Sockets Layer). Wymuszanie połączeń SSL między serwerem bazy danych a aplikacją kliencką ułatwia ochronę przed atakami typu man-in-the-middle dzięki szyfrowaniu strumienia danych między serwerem a aplikacją.
Krok 1. Uzyskiwanie certyfikatu SSL
Pobierz certyfikat wymagany do komunikacji za pośrednictwem protokołu SSL z serwerem https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem usługi Azure Database for MySQL i zapisz plik certyfikatu na dysku lokalnym (na przykład w tym samouczku jest używany plik c:\ssl). W przypadku programów Microsoft Internet Explorer i Microsoft Edge: po zakończeniu pobierania zmień nazwę certyfikatu na BaltimoreCyberTrustRoot.crt.pem.
Zobacz następujące linki do certyfikatów dla serwerów w suwerennych chmurach: Azure Government, Microsoft Azure obsługiwane przez firmę 21Vianet i Azure (Niemcy).
Krok 2. Powiązanie protokołu SSL
W przypadku określonych parametry połączenia języka programowania zapoznaj się z poniższym przykładowym kodem.
Nawiązywanie połączenia z serwerem przy użyciu aplikacji MySQL Workbench za pośrednictwem protokołu SSL
Skonfiguruj program MySQL Workbench, aby bezpiecznie nawiązać połączenie za pośrednictwem protokołu SSL.
W oknie dialogowym Konfigurowanie nowego połączenia przejdź do karty SSL .
Zaktualizuj pole Użyj protokołu SSL do opcji "Wymagaj".
W polu Plik urzędu certyfikacji SSL wprowadź lokalizację pliku DigiCertGlobalRootG2.crt.pem.
W przypadku istniejących połączeń możesz powiązać protokół SSL, klikając prawym przyciskiem myszy ikonę połączenia i wybierając pozycję Edytuj. Następnie przejdź do karty SSL i powiąż plik certyfikatu.
Nawiązywanie połączenia z serwerem przy użyciu interfejsu wiersza polecenia mySQL za pośrednictwem protokołu SSL
Innym sposobem powiązania certyfikatu SSL jest użycie interfejsu wiersza polecenia MySQL, wykonując następujące polecenia.
mysql.exe -h mydemoserver.mysql.database.azure.com -u Username@mydemoserver -p --ssl-mode=REQUIRED --ssl-ca=c:\ssl\DigiCertGlobalRootG2.crt.pem
Uwaga
W przypadku korzystania z interfejsu wiersza polecenia MySQL w systemie Windows może zostać wyświetlony błąd SSL connection error: Certificate signature check failed
. W takim przypadku zastąp --ssl-mode=REQUIRED --ssl-ca={filepath}
parametry parametrami --ssl
.
Krok 3. Wymuszanie połączeń SSL na platformie Azure
Korzystanie z witryny Azure Portal
Korzystając z witryny Azure Portal, odwiedź serwer usługi Azure Database for MySQL, a następnie kliknij pozycję Zabezpieczenia połączeń. Użyj przycisku przełącznika, aby włączyć lub wyłączyć ustawienie Wymuszaj połączenie SSL, a następnie kliknij przycisk Zapisz. Firma Microsoft zaleca zawsze włączenie ustawienia Wymuszaj połączenie SSL w celu zapewnienia zwiększonych zabezpieczeń.
Korzystanie z interfejsu wiersza polecenia platformy Azure
Możesz włączyć lub wyłączyć parametr ssl-enforcement , używając odpowiednio wartości Włączone lub Wyłączone w interfejsie wiersza polecenia platformy Azure.
az mysql server update --resource-group myresource --name mydemoserver --ssl-enforcement Enabled
Krok 4. Weryfikowanie połączenia SSL
Wykonaj polecenie stanu mysql, aby sprawdzić, czy nawiązano połączenie z serwerem MySQL przy użyciu protokołu SSL:
mysql> status
Upewnij się, że połączenie jest szyfrowane, przeglądając dane wyjściowe, które powinny zawierać następujące informacje: SSL: szyfrowanie w użyciu to AES256-SHA
Przykładowy kod
Aby nawiązać bezpieczne połączenie z usługą Azure Database for MySQL za pośrednictwem protokołu SSL z aplikacji, zapoznaj się z następującymi przykładami kodu:
Zapoznaj się z listą zgodnych sterowników obsługiwanych przez usługę 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 (korzystanie z 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 (Łącznik MySQL dla języka 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 (Łącznik MariaDB dla języka 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;
});
Następne kroki
- Aby dowiedzieć się więcej o wygaśnięciu i rotacji certyfikatów, zapoznaj się z dokumentacją rotacji certyfikatów
- Zapoznaj się z różnymi opcjami łączności aplikacji, postępując zgodnie z bibliotekami połączeń dla usługi Azure Database for MySQL