Configurar conectividade SSL em seu aplicativo para se conectar com segurança ao Banco de Dados do Azure para MySQLConfigure SSL connectivity in your application to securely connect to Azure Database for MySQL

O Banco de Dados do Azure para MySQL dá suporte à conexão de seu servidor de Banco de Dados do Azure para MySQL para aplicativos cliente usando o protocolo SSL.Azure Database for MySQL supports connecting your Azure Database for MySQL server to client applications using Secure Sockets Layer (SSL). Impor conexões SSL entre seu servidor de banco de dados e os aplicativos cliente ajuda a proteger contra ataques de "intermediários" criptografando o fluxo de dados entre o servidor e seu aplicativo.Enforcing SSL connections between your database server and your client applications helps protect against "man in the middle" attacks by encrypting the data stream between the server and your application.

Etapa 1: Obter um certificado SSLStep 1: Obtain SSL certificate

Baixe o certificado necessário para se comunicar por SSL com o servidor de banco de dados do Azure para MySQL do https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem e salve o arquivo de certificado em sua unidade local (este tutorial usa c:\ssl, por exemplo).Download the certificate needed to communicate over SSL with your Azure Database for MySQL server from https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem and save the certificate file to your local drive (this tutorial uses c:\ssl for example). Para o Microsoft Internet Explorer e Microsoft Edge: depois que o download for concluído, renomeie o certificado para BaltimoreCyberTrustRoot.crt.pem.For Microsoft Internet Explorer and Microsoft Edge: After the download has completed, rename the certificate to BaltimoreCyberTrustRoot.crt.pem.

Consulte os links a seguir para obter certificados para servidores em nuvens soberanas: Azure governamental, Azure Chinae Azure Alemanha.See the following links for certificates for servers in sovereign clouds: Azure Government, Azure China, and Azure Germany.

Etapa 2: associar o SSLStep 2: Bind SSL

Para obter cadeias de conexão de linguagem de programação específica, consulte o código de exemplo abaixo.For specific programming language connection strings, please refer to the sample code below.

Conectando ao servidor usando o MySQL Workbench sobre SSLConnecting to server using MySQL Workbench over SSL

Configure o MySQL Workbench para se conectar com segurança por SSL.Configure MySQL Workbench to connect securely over SSL.

  1. Na caixa de diálogo Configurar Nova Conexão, navegue até a guia SSL.From the Setup New Connection dialogue, navigate to the SSL tab.

  2. Atualize o campo usar SSL para "exigir".Update the Use SSL field to "Require".

  3. No campo Arquivo de AC SSL:, insira o local do arquivo de BaltimoreCyberTrustRoot.crt.pem.In the SSL CA File: field, enter the file location of the BaltimoreCyberTrustRoot.crt.pem.

    Salvar configuração SSL

Para conexões existentes, você pode associar o SSL clicando com o botão direito do mouse no ícone de conexão e escolhendo Editar.For existing connections, you can bind SSL by right-clicking on the connection icon and choose edit. Em seguida, navegue até a guia SSL e associe o arquivo de certificado.Then navigate to the SSL tab and bind the cert file.

Conectar-se ao servidor usando a CLI do MySQL sobre SSLConnecting to server using the MySQL CLI over SSL

Outra maneira de associar o certificado SSL é usar a interface de linha de comando do MySQL executando os seguintes comandos.Another way to bind the SSL certificate is to use the MySQL command-line interface by executing the following commands.

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

Observação

Ao usar a interface de linha de comando do MySQL no Windows, é possível que você receba um erro SSL connection error: Certificate signature check failed.When using the MySQL command-line interface on Windows, you may receive an error SSL connection error: Certificate signature check failed. Se isso ocorrer, substitua os parâmetros --ssl-mode=REQUIRED --ssl-ca={filepath} por --ssl.If this occurs, replace the --ssl-mode=REQUIRED --ssl-ca={filepath} parameters with --ssl.

Etapa 3: impor conexões SSL no AzureStep 3: Enforcing SSL connections in Azure

Usando o portal do AzureUsing the Azure portal

Usando o Portal do Azure, visite seu servidor de Banco de Dados do Azure para MySQL e, em seguida, clique em Segurança de conexão.Using the Azure portal, visit your Azure Database for MySQL server, and then click Connection security. Use o botão de alternância para habilitar ou desabilitar a configuração Impor conexão SSL e, em seguida, clique em Salvar.Use the toggle button to enable or disable the Enforce SSL connection setting, and then click Save. A Microsoft recomenda sempre habilitar a configuração Impor conexão SSL para melhorar a segurança.Microsoft recommends to always enable the Enforce SSL connection setting for enhanced security. enable-sslenable-ssl

Usando a CLI do AzureUsing Azure CLI

Você pode habilitar ou desabilitar o parâmetro ssl-enforcement usando os valores Enabled ou Disabled respectivamente na CLI do Azure.You can enable or disable the ssl-enforcement parameter by using Enabled or Disabled values respectively in Azure CLI.

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

Etapa 4: Verificar a conexão SSLStep 4: Verify the SSL connection

Execute o comando status de mysql para verificar se você se conectou ao servidor MySQL usando o SSL:Execute the mysql status command to verify that you have connected to your MySQL server using SSL:

mysql> status

Confirme que a conexão é criptografada, revisando a saída, que deve mostrar: SSL: A criptografia em uso é AES256 SHAConfirm the connection is encrypted by reviewing the output, which should show: SSL: Cipher in use is AES256-SHA

Código de exemploSample code

Para estabelecer uma conexão segura com o Banco de Dados do Azure para MySQL sobre SSL de seu aplicativo, veja os exemplos de código a seguir:To establish a secure connection to Azure Database for MySQL over SSL from your application, refer to the following code samples:

Consulte a lista de drivers compatíveis com suporte pelo banco de dados do Azure para o serviço mysql.Refer to the list of compatible drivers supported by the Azure Database for MySQL service.

PHPPHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/BaltimoreCyberTrustRoot.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($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (usando PDO)PHP (Using PDO)

$options = array(
    PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/BaltimoreCyberTrustRoot.crt.pem'
);
$db = new PDO('mysql:host=mydemoserver.mysql.database.azure.com;port=3306;dbname=databasename', 'username@mydemoserver', 'yourpassword', $options);

Python (MySQLConnector Python)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/BaltimoreCyberTrustRoot.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)Python (PyMySQL)

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

Django (PyMySQL)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/BaltimoreCyberTrustRoot.crt.pem'}
        }
    }
}

RubyRuby

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

GolangGolang

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.mysql.database.azure.com', 'quickstartdb')   
db, _ := sql.Open("mysql", connectionString)

Java (conector do MySQL para Java)Java (MySQL Connector for 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 (conector do MariaDB para Java)Java (MariaDB Connector for 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).NET (MySqlConnector)

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

Próximas etapasNext steps

Analise as várias opções de conectividade do aplicativo em Bibliotecas de conexão para o Banco de Dados do Azure para MySQLReview various application connectivity options following Connection libraries for Azure Database for MySQL