在您的應用程式中設定 SSL 連線能力,以安全地連線至適用於 MariaDB 的 Azure 資料庫

重要

適用於 MariaDB 的 Azure 資料庫 位於淘汰路徑上。 強烈建議您移轉至 適用於 MySQL 的 Azure 資料庫。 如需移轉至 適用於 MySQL 的 Azure 資料庫 的詳細資訊,請參閱 適用於 MariaDB 的 Azure 資料庫 發生什麼事?

適用於 MariaDB 的 Azure 資料庫 支援使用安全套接字層 (SSL) 將 適用於 MariaDB 的 Azure 資料庫 伺服器連線到用戶端應用程式。 在資料庫伺服器與用戶端應用程式之間強制執行 SSL 連線,藉由加密伺服器與應用程式之間的數據流,協助防範「中間人」攻擊。

取得 SSL 憑證

從 下載透過 SSL 與 適用於 MariaDB 的 Azure 資料庫 伺服器https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem通訊所需的憑證,並將憑證檔案儲存到本機磁碟驅動器(本教學課程使用 c:\ssl 例如)。 若為 Microsoft Internet Explorer 和 Microsoft Edge: 下載完成後,請將憑證重新命名為 BaltimoreCyberTrustRoot.crt.pem。

如需主權雲端中伺服器的憑證連結,請參閱下列連結: Azure Government由 21Vianet 運作的 Microsoft Azure 和 Azure 德國

系結 SSL

連線 透過SSL使用 MySQL Workbench 的伺服器

設定 MySQL Workbench 以透過 SSL 安全地連線。

  1. 從 [設定新增 連線] 對話框,流覽至 [SSL] 索引標籤。

  2. 將 [ 使用 SSL] 欄位更新為 [需要]。

  3. 在 [SSL CA 檔案:] 字段中,輸入 BaltimoreCyberTrustRoot.crt.pem檔案位置。

    Save SSL configuration

針對現有的連線,您可以用滑鼠右鍵按兩下連線圖示並選擇 [編輯],以系結 SSL。 然後流覽至 [SSL ] 索引標籤並系結憑證檔案。

透過 SSL 使用 MySQL CLI 連線 至伺服器

系結 SSL 憑證的另一種方式是執行下列命令,以使用 MySQL 命令行介面。

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

注意

在 Windows 上使用 MySQL 命令行介面時,您可能會收到錯誤 SSL connection error: Certificate signature check failed。 如果發生這種情況,請將 --ssl-mode=REQUIRED --ssl-ca={filepath} 參數取代為 --ssl

在 Azure 中強制執行 SSL 連線

使用 Azure 入口網站

使用 Azure 入口網站,流覽您的 適用於 MariaDB 的 Azure 資料庫 伺服器,然後選取 [連線 安全性]。 使用切換按鈕來啟用或停用 [強制執行 SSL 連線 ] 設定,然後選取 [ 儲存]。 Microsoft 建議一律啟用 強制執行 SSL 連線 設定,以提高安全性。 enable-ssl for MariaDB server

使用 Azure CLI

您可以在 Azure CLI 中分別使用 Enabled 或 Disabled 值來啟用或停用 ssl-enforcement 參數。

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

確認 SSL 連線

執行 mysql status 命令,確認您已使用 SSL 連線到 MariaDB 伺服器:

status

檢閱應該顯示的輸出來確認連線已加密: SSL:使用中的加密是 AES256-SHA

範例指令碼

若要從您的應用程式建立透過SSL適用於 MariaDB 的 Azure 資料庫的安全連線,請參閱下列程式代碼範例:

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/BaltimoreCyberTrustRoot.crt.pem", NULL, NULL) ;
mysqli_real_connect($conn, 'mydemoserver.mariadb.database.azure.com', 'myadmin@mydemoserver', 'yourpassword', 'quickstartdb', 3306, MYSQLI_CLIENT_SSL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
if (mysqli_connect_errno($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

Python (MySQL 連線 or Python)

try:
    conn = mysql.connector.connect(user='myadmin@mydemoserver',
                                   password='yourpassword',
                                   database='quickstartdb',
                                   host='mydemoserver.mariadb.database.azure.com',
                                   ssl_ca='/var/www/html/BaltimoreCyberTrustRoot.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)

conn = pymysql.connect(user='myadmin@mydemoserver',
                       password='yourpassword',
                       database='quickstartdb',
                       host='mydemoserver.mariadb.database.azure.com',
                       ssl={'ca': '/var/www/html/BaltimoreCyberTrustRoot.crt.pem'})

Ruby

client = Mysql2::Client.new(
        :host     => 'mydemoserver.mariadb.database.azure.com',
        :username => 'myadmin@mydemoserver',
        :password => 'yourpassword',
        :database => 'quickstartdb',
        :sslca => '/var/www/html/BaltimoreCyberTrustRoot.crt.pem'
        :ssl_mode => 'required'
    )

Ruby on Rails

default: &default
  adapter: mysql2
  username: username@mydemoserver
  password: yourpassword
  host: mydemoserver.mariadb.database.azure.com
  sslca: BaltimoreCyberTrustRoot.crt.pem
  sslverify: true

Golang

rootCertPool := x509.NewCertPool()
pem, _ := ioutil.ReadFile("/var/www/html/BaltimoreCyberTrustRoot.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.mariadb.database.azure.com', 'quickstartdb')
db, _ := sql.Open("mysql", connectionString)

Java (JDBC)

# 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.mariadb.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

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.mariadb.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

.NET (MySql 連線 or)

var builder = new MySqlConnectionStringBuilder
{
    Server = "mydemoserver.mysql.database.azure.com",
    UserID = "myadmin@mydemoserver",
    Password = "yourpassword",
    Database = "quickstartdb",
    SslMode = MySqlSslMode.VerifyCA,
    CACertificateFile = "BaltimoreCyberTrustRoot.crt.pem",
};
using (var connection = new MySqlConnection(builder.ConnectionString))
{
    connection.Open();
}

下一步

若要了解憑證到期和輪替,請參閱 憑證輪替檔