Este tópico descreve como se conectar a uma instância do ApsaraDB RDS for MySQL usando a CLI do MySQL ou JDBC após ativar a criptografia SSL.
Pré-requisitos
A criptografia SSL está ativada. Caso contrário, consulte Ativar rapidamente a criptografia SSL usando um certificado de nuvem ou Ativar a criptografia SSL usando um certificado personalizado.
Você possui o certificado CA do banco de dados. Para obter o certificado, consulte Baixar um certificado CA ou Ativar a criptografia SSL usando um certificado personalizado.
Procedimento
Conectar-se ao MySQL usando um certificado de nuvem
Após ativar a criptografia SSL, a conexão entre seu cliente e a instância do ApsaraDB RDS for MySQL será criptografada dependendo do tipo de cliente e de sua configuração. Modifique as configurações do cliente ou o código da aplicação para exigir uma conexão criptografada e verifique a identidade da instância.
Instâncias que executam MySQL 8.4, 8,0 ou 5,7 com versão secundária do mecanismo 20241130 ou posterior suportam criptografia SSL forçada. Se você ativar a criptografia SSL forçada, os clientes só poderão se conectar à instância por meio de uma conexão criptografada com SSL.
MySQL CLI
Para clientes que executam MySQL 5.7.11 ou posterior, adicione a opção --ssl-mode ao comando de conexão para configurar a criptografia SSL.
Para clientes MariaDB e clientes MySQL que executam uma versão anterior à 5.7.11, use opções como --ssl e --ssl-verify-server-cert. Para mais informações, consulte a documentação oficial do MariaDB e do MySQL.
--ssl-mode=DISABLED: A conexão não é criptografada.
--ssl-mode=PREFERRED ou sem a opção --ssl-mode: Tenta estabelecer uma conexão criptografada. Se a tentativa falhar, o cliente usa uma conexão não criptografada.
--ssl-mode=REQUIRED: Uma conexão criptografada é obrigatória. A conexão falha se não for possível estabelecer uma conexão criptografada.
--ssl-mode=VERIFY_CA: Exige uma conexão criptografada e verifica o certificado do servidor em relação ao certificado CA local.
--ssl-mode=VERIFY_IDENTITY: Exige uma conexão criptografada, verifica o certificado do servidor em relação ao certificado CA local e valida se o nome do host ou endereço IP no certificado do servidor corresponde ao usado para a conexão.
Exemplo 1: Tenta estabelecer uma conexão criptografada. Se a tentativa falhar, uma conexão não criptografada será usada.
mysql -h {endpoint} -u {username} -p --ssl-mode=PREFERRED
Exemplo 2: Exige uma conexão criptografada e a verificação do certificado do servidor.
mysql -h {endpoint} -u {username} -p --ssl-mode=VERIFY_CA --ssl-ca={path-to-ca-certificate}/ApsaraDB-CA-Chain.pem
Nos exemplos anteriores, substitua {endpoint}, {username} e {path-to-ca-certificate} pelos seus valores reais.
Para mais informações sobre a opção --ssl-mode, consulte a documentação oficial do MySQL.
MySQL Workbench
Abra o MySQL Workbench e escolha .
Insira o endpoint, o nome de usuário e a senha.
-
Na aba SSL, configure o parâmetro Use SSL, especifique o certificado CA baixado no formato PEM no campo SSL CA File e clique em Test Connection ou OK.
NotaPara obter uma descrição das opções do parâmetro Use SSL, consulte as descrições de --ssl-mode na seção MySQL CLI.
Data Management (DMS)
Ao adicionar uma instância do ApsaraDB RDS for MySQL no Data Management (DMS), defina o parâmetro Enable SSL. Para mais informações, consulte Registrar uma instância de banco de dados do Alibaba Cloud.
Também é possível clicar com o botão direito em uma instância existente, selecione Edit Instance e configure as definições na seção Advanced Information.
Código da aplicação
Java
O Connector/J (mysql-connector-java) é o driver JDBC oficial para MySQL. Este exemplo usa mysql-connector-java 8.0.19 como dependência.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
O código de exemplo a seguir usa a propriedade sslMode para especificar o modo SSL. Essa propriedade é suportada no mysql-connector-java 8.0.13 e versões posteriores. Se você usar uma versão anterior, deverá usar as propriedades useSSL, requireSSL e verifyServerCertificate. Para mais informações, consulte a documentação do MySQL.
Código de exemplo:
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
// Set SslMode as needed. For available options, see the MySQL CLI section.
mysqlDS.setSslMode("VERIFY_IDENTITY");
// The truststore stores the CA certificate. The truststore type is set to JKS.
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// Replace the path after file:/ with the path to your ApsaraDB-CA-Chain.jks file.
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
// The password for the downloaded JKS file is apsaradb and cannot be changed.
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
// Your database endpoint
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
// Your database port
mysqlDS.setPort(3306);
// Your database username
mysqlDS.setUser("xxxxxx");
// Your database password
mysqlDS.setPassword("xxxxxx");
// Your database name
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Python
# Install pymysql: pip install pymysql
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # "ca" is the CA certificate path. "mode" is ssl-mode.
conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config)
cursor = conn.cursor()
cursor.execute('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
except pymysql.Error as e:
print(e)
Conectar-se ao MySQL usando um certificado personalizado
MySQL CLI
Para clientes que executam MySQL 5.7.11 ou posterior, adicione a opção --ssl-mode ao comando de conexão para configurar a criptografia SSL.
Para clientes MariaDB e clientes MySQL que executam uma versão anterior à 5.7.11, use opções como --ssl e --ssl-verify-server-cert. Para mais informações, consulte a documentação oficial do MariaDB e do MySQL.
--ssl-mode=DISABLED: A conexão não é criptografada.
--ssl-mode=PREFERRED ou sem a opção --ssl-mode: Tenta estabelecer uma conexão criptografada. Se a tentativa falhar, o cliente usa uma conexão não criptografada.
--ssl-mode=REQUIRED: Uma conexão criptografada é obrigatória. A conexão falha se não for possível estabelecer uma conexão criptografada.
--ssl-mode=VERIFY_CA: Exige uma conexão criptografada e verifica o certificado do servidor em relação ao certificado CA local.
--ssl-mode=VERIFY_IDENTITY: Exige uma conexão criptografada, verifica o certificado do servidor em relação ao certificado CA local e valida se o nome do host ou endereço IP no certificado do servidor corresponde ao usado para a conexão.
Exemplos:
-
Tenta estabelecer uma conexão criptografada. Se a tentativa falhar, uma conexão não criptografada será usada.
mysql -h {endpoint} -u {username} -p --ssl-mode=PREFERRED -
Exige uma conexão criptografada e a verificação do certificado do servidor.
mysql -h {endpoint} -u {username} -p --ssl-mode=VERIFY_CA --ssl-ca={path-to-custom-ca-certificate}
No exemplo anterior, substitua
{RDS endpoint},{RDS username},{CA certificate path}e{custom CA certificate path}pelos valores reais.Para mais informações sobre a opção --ssl-mode, consulte a documentação oficial do MySQL.
MySQL Workbench
Abra o MySQL Workbench e escolha Database > Manage Connections.
Insira o endpoint, o nome de usuário e a senha.
Na aba SSL, configure o parâmetro Use SSL e especifique seu certificado CA personalizado no campo SSL CA File. Em seguida, clique em Test Connection ou OK.
Para obter uma descrição das opções do parâmetro Use SSL, consulte as descrições de --ssl-mode na seção MySQL CLI.
Data Management (DMS)
Ao adicionar uma instância do ApsaraDB RDS for MySQL no Data Management (DMS), defina o parâmetro Enable SSL. Para mais informações, consulte Registrar uma instância de banco de dados do Alibaba Cloud.
Também é possível clicar com o botão direito em uma instância existente, selecione Edit Instance e configure as definições na seção Advanced Information.
Código da aplicação
Java
O Connector/J (mysql-connector-java) é o driver JDBC oficial para MySQL. Este exemplo usa mysql-connector-java 8.0.19 como dependência.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
Se você usar um certificado personalizado, deverá gerar manualmente um arquivo JKS da seguinte forma:
-
Converta seu certificado de cliente e chave privada para o formato PKCS#12, pois o utilitário keytool não suporta diretamente a importação de chave privada e certificado no formato PEM. Use o OpenSSL para realizar a conversão:
openssl pkcs12 -export -in {custom-ca-certificate} -inkey {custom-ca-private-key} -out keystore.p12 -name ganyang -CAfile {custom-ca-certificate} # Enter a password. This password is required when you establish a connection. Enter Encryption Password: Verifying - Enter Encryption Password: -
Use o utilitário keytool para importar o arquivo PKCS#12 para um novo arquivo JKS:
keytool -importkeystore -deststorepass JKS-password -destkeypass key-password -destkeystore keystore.jks -deststoretype pkcs12 -srckeystore keystore.p12 -srcstoretype pkcs12 -srcstorepass P12-password -alias your-aliasParâmetros:
-deststorepass: The password for the JKS file. -destkeypass: The password for the key in the JKS file. -destkeystore: The JKS file to create or an existing JKS file. -deststoretype: The destination file type (PKCS#12). -srckeystore: The source PKCS#12 file. -srcstoretype: The source file type (PKCS#12). -srcstorepass: The password for the source PKCS#12 file. -alias: The alias for the client certificate and private key. Obtenha o arquivo JKS: Após a importação bem-sucedida, localize o arquivo keystore.jks no diretório de execução.
O código de exemplo a seguir usa a propriedade sslMode para especificar o modo SSL. Essa propriedade é suportada no mysql-connector-java 8.0.13 e versões posteriores. Se você usar uma versão anterior, deverá usar as propriedades useSSL, requireSSL e verifyServerCertificate. Para mais informações, consulte a documentação do MySQL.
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
// Set SslMode as needed. For available options, see the MySQL CLI section.
mysqlDS.setSslMode("VERIFY_IDENTITY");
// The following example shows the connection parameters. Replace the truststore values with the path and password of the JKS file that you generated from your custom certificate.
// The truststore stores the CA certificate. The truststore type is set to JKS.
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// Replace the path after file:/ with the path to your custom JKS file.
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
// Use the password you created for your custom JKS file.
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
// Your database endpoint
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
// Your database port
mysqlDS.setPort(3306);
// Your database username
mysqlDS.setUser("xxxxxx");
// Your database password
mysqlDS.setPassword("xxxxxx");
// Your database name
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Python
# Install pymysql: pip install pymysql
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # "ca" is the CA certificate path. "mode" is ssl-mode.
conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config)
cursor = conn.cursor()
cursor.execute('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
except pymysql.Error as e:
print(e)