设置SSL加密

为了提高链路安全性,您可以启用SSL(Secure Sockets Layer)加密,并安装SSL CA证书到需要的应用服务。SSL在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。

背景信息

SSLNetscape公司所提出的安全保密协议,在浏览器和Web服务器之间构造安全通道来进行数据传输,采用RC4、MD5、RSA等加密算法实现安全通讯。国际互联网工程任务组(IETF)对SSL 3.0进行了标准化,标准化后更名为安全传输层协议(TLS)。由于SSL这一术语更为常用,因此本文所述的SSL加密实际是指TLS加密。

适用场景

  • 公网访问数据库:当客户端通过公共互联网连接PolarDB集群时,数据链路暴露在非信任网络中,需进行加密以防范中间人攻击。

  • 满足安全合规要求:特定的行业或数据保护法规(如PCI-DSS、GDPR)要求对传输中的敏感数据进行加密。

  • 跨网络环境通信:在混合云或多VPC架构中,跨越网络边界的数据流需要通过SSL加密保障其机密性和完整性。

注意事项

操作步骤

步骤一:开启SSL加密

重要

开启SSL加密会重启集群,建议您在业务低峰期操作。

  1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

  2. 在左侧菜单栏中单击配置与管理 > 安全管理

  3. SSL配置页签,单击SSL状态右侧滑块,开启SSL加密。

    说明

    支持为主地址、集群地址和自定义地址配置SSL。

  4. 设置SSL对话框中,选择需要开通SSL加密的链路,单击确定

    说明

    您可以根据需要选择加密私网地址或公网地址,但每次只能加密一条链路。

    设置SSL加密

步骤二:下载证书

开启SSL加密后,您可以下载PolarDB集群的证书,用于客户端远程连接PolarDB集群时校验数据库真伪。

  1. SSL配置页签,单击相应地址区域中的下载证书

    下载证书

  2. 下载的文件为压缩包,包含如下三个文件:

    • .p7b格式文件:用于Windows系统中导入CA证书。

    • .pem格式文件:用于其他系统或应用中导入CA证书。

    • .jks格式文件:Java中的truststore证书存储文件,密码统一为apsaradb,用于Java程序中导入CA证书链。

      说明

      Java中使用JKS证书文件时,jdk7jdk8需要修改默认的jdk安全配置,在连接PolarDB数据库的服务器的jre/lib/security/java.security文件中,修改如下两项配置:

      jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224
      jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

      若不修改jdk安全配置,会报如下错误。其它类似报错,一般也都由Java安全配置导致。

      javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints

步骤三:从客户端连接PolarDB集群

开启SSL加密后,客户端和PolarDB集群之间的连接是否实际使用SSL加密取决于客户端的类型和设置。例如,某些客户端可能默认采用加密连接。您可以修改客户端的设置或代码,确保建立加密连接并验证PolarDB集群的身份。

说明

若您是使用DMS登录并管理PolarDB集群,则无需对链路加密。

命令行

对于MySQL 5.7.11及以后版本的客户端,在连接命令中添加--ssl-mode选项可以设置SSL加密。

  • --ssl-mode=DISABLED,表示连接不加密。

  • --ssl-mode=PREFERRED或者不添加--ssl-mode选项,表示尝试加密连接,如果无法加密则采用非加密连接。

  • --ssl-mode=REQUIRED,表示必须加密连接,如果无法加密则连接失败。

  • --ssl-mode=VERIFY_CA,表示必须加密连接,并用本地的CA证书验证服务器证书是否有效。

  • --ssl-mode=VERIFY_IDENTITY,表示必须加密连接,并用本地的CA证书验证服务器证书是否有效,并验证服务器证书的主机名或IP地址是否与实际连接的主机名或IP地址匹配。

示例一:尝试加密连接,如果无法加密则采用非加密连接。

mysql -h {连接地址} -u {账号} -p --ssl-mode=PREFERRED

示例二:要求加密连接,并验证服务器证书的有效性。

mysql -h {连接地址} -u {账号} -p --ssl-mode=VERIFY_CA --ssl-ca={CA证书路径}/ApsaraDB-CA-Chain.pem
说明
  • 上述示例里的{连接地址}{账号}{CA证书路径}需替换为实际的值。

  • 更多关于--ssl-mode选项的说明,请参见MySQL官方文档。

MySQL Workbench

  1. 打开MySQL Workbench,选择Database > Manage Connections

  2. 填写PolarDB连接地址和账号密码。

  3. SSL页签下,设置Use SSL参数,指定SSL CA File为下载的PEM格式CA证书,然后单击Test Connection或者OK

    说明

    关于Use SSL参数的选项,可以参考命令行连接方式的--ssl-mode说明。

应用程序代码

Java

Connector/J(mysql-connector-java)是MySQL官方提供的JDBC驱动程序。本示例使用mysql-connector-java 8.0.19版本作为依赖。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>
说明

以下示例代码使用sslMode属性指定SSL模式。mysql-connector-java8.0.13版本开始支持该属性,如果您使用更早的版本,则需要改为使用useSSL、requireSSLverifyServerCertificate属性,具体请参见MySQL文档

示例代码:

package com.example.ssltest;

import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
       Connection conn = null;
        MysqlDataSource mysqlDS=null;

        try{
            mysqlDS = new MysqlDataSource();
            //可按需设置SslMode。关于该属性的选项,请参见命令行连接方式的说明。
            mysqlDS.setSslMode("VERIFY_IDENTITY");
          
            //truststore用于存储CA证书,这里设置truststore类型为JKS。
            mysqlDS.setTrustCertificateKeyStoreType("JKS");
            // 请将file:/后面的路径改为您的ApsaraDB-CA-Chain.jks文件的路径。
            mysqlDS.setTrustCertificateKeyStoreUrl("file://{CA证书路径}/ApsaraDB-CA-Chain.jks");
            // 下载的JKS文件的密码为apsaradb,不能修改。
            mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
          
            // 您的数据库连接串
            mysqlDS.setServerName("your_polardb_host");
            // 您的数据库端口
            mysqlDS.setPort(3306);
            // 您的数据库账号
            mysqlDS.setUser("your_username");
            // 您的数据库密码
            mysqlDS.setPassword("your_password");
            // 您的数据库名
            mysqlDS.setDatabaseName("your_database");

            System.out.println("正在尝试连接数据库...");
            conn = mysqlDS.getConnection();
            System.out.println("数据库连接成功!");
            
            // 使用 try-with-resources 确保 Statement 和 ResultSet 被自动关闭
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT VERSION()")) {
                
                // 检查查询是否有返回结果
                if (rs.next()) {
                    // 获取第一列的结果并打印
                    String dbVersion = rs.getString(1);
                    System.out.println("数据库版本: " + dbVersion);
                } else {
                    System.out.println("未能获取到数据库版本信息。");
                }
            }

        }catch(Exception e){
            e.printStackTrace();
        } finally {
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Python

# 安装pymysql
# pip install pymysql

import pymysql

# --- 配置你的数据库信息 ---
db_config = {
    'host': 'your_polardb_host',          # 您的集群地址
    'user': 'your_username',            # 您的用户名
    'password': 'your_password',        # 您的密码
    'database': 'your_database',        # 您要连接的数据库
    'port': 3306
}

# --- 配置SSL信息 ---
ssl_args = {
    'ca': '{CA证书路径}/ApsaraDB-CA-Chain.pem',
    'mode': 'VERIFY_CA'
}

try:
    # 建立连接,传入ssl参数
    print("正在尝试使用SSL连接到MySQL...")
    connection = pymysql.connect(**db_config, ssl=ssl_args)
    print("SSL连接成功!")

    with connection.cursor() as cursor:
        # 执行一个简单的查询来验证连接
        cursor.execute("SELECT VERSION()")
        version = cursor.fetchone()
        print(f"数据库版本: {version[0]}")

except pymysql.MySQLError as e:
    # 打印SSL相关的错误会很有帮助
    print(f"连接失败: {e}")
finally:
    if 'connection' in locals() and connection.open:
        connection.close()
        print("数据库连接已关闭。")

Sysbench压测配置

  1. 下载证书并解压。

  2. Sysbench配置:

    1. sysbench命令行中增加--mysql-ssl=on

    2. 如果使用的是Sysbench 1.0.x版本,则需要在执行sysbench命令的当前目录下,将.pem格式文件重命名为cacert.pem。因为Sysbench的版本识别中,SSL证书的名称是硬编码为cacert.pem。

    3. 如果使用的是Sysbench 1.1.x版本,可以按照Sysbench 1.0.x的配置方式设置SysbenchSSL证书。也可以通过--mysql-ssl-ca参数传入PEM文件的路径。

  3. 压测方式,请参考性能测试方法(OLTP)

    说明

    压测时,请注意MySQL Client版本需要与PolarDBMySQL版本保持一致。

步骤四:验证连接已加密

SSL协议有很多版本,PolarDB目前支持TLSv1.2及以上的版本。在SSL握手期间,客户端会和PolarDB服务端交换协商信息,这些信息包括TLS版本、加密套件和会话密钥等。详细的加密套件列表可以在OpenSSL官网进行查看。

  1. 使用已配置好SSL的客户端连接到PolarDB集群。

  2. 执行以下SQL查询:

    SHOW STATUS LIKE 'ssl_cipher';
    
    +---------------+---------------------------+
    | Variable_name | Value                     |
    +---------------+---------------------------+
    | Ssl_cipher    | DHE-RSA-AES256-GCM-SHA384 |
    +---------------+---------------------------+
  3. 结果分析:

    • 如果Value列返回一个非空值(如DHE-RSA-AES256-GCM-SHA384),表示当前连接是加密的。

    • 如果Value列为空,表示当前连接未加密,请检查客户端配置是否正确。

维护与管理

修改受保护地址

您需要修改SSL受保护的地址,可以单击相应地址区域中的设置SSL进行修改。

重要

修改受保护地址后,SSL证书会自动更新,同时重启您的集群,建议您在业务低峰期操作。

设置SSL

更新证书有效期

如果您修改了SSL连接地址或证书有效期即将到期,您需要手动更新证书有效期,以下内容将为您介绍如何更新证书有效期。

重要

更新证书有效期操作将会重启集群,重启前请做好业务安排。

  1. SSL配置页签中单击更新有效期

    更新证书有效期

  2. 在弹出的对话框中,单击确定

  3. 更新有效期后,重新下载配置证书。

开启证书自动轮换

开启证书自动轮转后,在证书即将过期的10天内,PolarDB会在集群的可维护时间窗口内自动更新证书。

重要

自动更新证书将会重启集群,建议您在业务低峰期操作。

  1. SSL配置页签中,单击高级选项

  2. 高级选项对话框中,选择开启证书自动轮转,并单击确认证书自动轮换

关闭SSL加密

重要

关闭SSL加密会重启集群,建议您在业务低峰期操作。

  1. SSL配置页签,单击SSL状态右侧滑块,关闭SSL加密。

  2. 在弹出的对话框中,单击确定

相关API

API

描述

DescribeDBClusterSSL

查询PolarDB集群SSL设置。

ModifyDBClusterSSL

设置PolarDB集群SSL加密的开通、关闭或更新CA证书。