在您的應用程式中設定 SSL 連線能力,以安全地連線至適用於 MySQL 的 Azure 資料庫
適用於: 適用於 MySQL 的 Azure 資料庫 - 單一伺服器
重要
適用於 MySQL 的 Azure 資料庫單一伺服器位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫單一伺服器會發生什麼事?
適用於 MySQL 的 Azure 資料庫支援使用安全通訊端層 (SSL),將適用於 MySQL 的 Azure 資料庫伺服器連線至用戶端應用程式。 在您的資料庫伺服器和用戶端應用程式之間強制使用 SSL 連線,可將兩者之間的資料流加密,有助於抵禦「中間人」攻擊。
步驟 1:取得 SSL 憑證
從 https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem 下載要透過 SSL 與「適用於 MySQL 的 Azure 資料庫」伺服器通訊所需的憑證,並將該憑證檔儲存到本機磁碟機 (例如,本教學課程使用 c:\ssl)。 針對 Microsoft Internet Explorer 和 Microsoft Edge:在下載完成後,請將憑證重新命名為 BaltimoreCyberTrustRoot.crt.pem。
關於主權雲端的伺服器憑證,請參閱下列連結:Azure Government、由 21Vianet 營運的 Microsoft Azure 和 Azure 德國。
步驟 2:繫結 SSL
如需特定的程式設計語言連接字串,請參閱下列範例程式碼。
使用 MySQL Workbench 透過 SSL 連線至伺服器
設定使 MySQL Workbench 安全地透過 SSL 連線。
從 [設定新連線] 對話方塊,瀏覽至 [SSL] 索引標籤。
將 [使用 SSL] 欄位更新為 [需要]。
在 [SSL CA 檔案:] 欄位中輸入 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
注意
在 Windows 上使用 MySQL 命令列介面時,您可能會收到 SSL connection error: Certificate signature check failed
錯誤。 如果發生此狀況,請以 --ssl
取代 --ssl-mode=REQUIRED --ssl-ca={filepath}
參數。
步驟 3:在 Azure 中強制使用 SSL 連線
使用 Azure 入口網站
使用 Azure 入口網站,瀏覽適用於 MySQL 的 Azure 資料庫伺服器,然後按一下 [連線安全性]。 使用切換按鈕來啟用或停用 [強制使用 SSL 連線] 設定,然後按一下 [儲存]。 Microsoft 建議一律啟用 [強制使用 SSL 連線] 設定,以增強安全性。
使用 Azure CLI
您可以在 Azure CLI 中分別使用 Enabled 或 Disabled 值,以啟用或停用 ssl-enforcement 參數。
az mysql server update --resource-group myresource --name mydemoserver --ssl-enforcement Enabled
步驟 4:確認 SSL 連線
執行 mysql status 命令,確認您已使用 SSL 連線至 MySQL 伺服器︰
mysql> status
檢閱輸出來確認連線已加密,應該會顯示:SSL: Cipher in use is AES256-SHA
範例指令碼
若要從您的應用程式透過 SSL 對「適用於 MySQL 的 Azure 資料庫」建立安全連線,請參閱下列程式碼範例:
請參閱「適用於 MySQL 的 Azure 資料庫」服務支援的相容驅動程式清單。
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 (適用於 Java 的 MySQL 連接器)
# 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 (適用於 Java 的 MariaDB 連接器)
# 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;
});
下一步
- 若要了解憑證到期和輪替,請參閱憑證輪替文件
- 檢閱「適用於 MySQL 的 Azure 資料庫」的連線庫後面的各種應用程式連線能力選項