更新应用程序以使用新的 SSL/TLS 证书连接到 MySQL 数据库实例 - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

更新应用程序以使用新的 SSL/TLS 证书连接到 MySQL 数据库实例

自 2019 年 9 月 19 日起,Amazon RDS 发布了新的证书颁发机构 (CA) 证书,以便使用安全套接字层或传输层安全性 (SSL/TLS) 连接到 RDS 数据库实例。接下来,您可以找到有关更新应用程序以使用新证书的信息。

本主题可帮助您确定是否有任何客户端应用程序使用 SSL/TLS 连接到您的数据库实例。如果是这样,您可以进一步检查这些应用程序是否需要证书验证才能连接。

注意

某些应用程序配置为仅在它们可以成功验证服务器上的证书时才连接到 MySQL 数据库实例。对于此类应用程序,您必须更新客户端应用程序信任存储,以包括新的 CA 证书。

您可以指定以下 SSL 模式:disabledpreferredrequired。当您使用 preferred SSL 模式并且 CA 证书不存在或不是最新时,以下行为适用:

  • 对于较新的 MySQL 次要版本,连接退回为不使用 SSL,并且系统仍然成功连接。

    由于这些更高版本使用 OpenSSL 协议,因此除非指定 required SSL 模式,否则过期的服务器证书不会阻止成功连接。

    以下 MySQL 次要版本使用 OpenSSL 协议:

    • 所有 MySQL 8.0 版本

    • MySQL 5.7.21 及更高的 MySQL 5.7 版本

    • MySQL 5.6.39 及更高的 MySQL 5.6 版本

    • MySQL 5.5.59 及更高的 MySQL 5.5 版本

  • 对于较旧的 MySQL 次要版本,将返回错误。

    由于这些较旧版本使用 yaSSL 协议,因此将严格执行证书验证并且连接不成功。

    以下 MySQL 次要版本使用 yaSSL 协议:

    • MySQL 5.7.19 及更早的 MySQL 5.7 版本

    • MySQL 5.6.37 及更早的 MySQL 5.6 版本

    • MySQL 5.5.57 及更早的 MySQL 5.5 版本

更新客户端应用程序信任存储中的 CA 证书后,可以在数据库实例上轮换这些证书。强烈建议在生产环境中实现这些过程之前,先在开发或测试环境中测试它们。

有关证书轮换的更多信息,请参阅轮换 SSL/TLS 证书。有关下载证书的更多信息,请参阅使用 SSL/TLS 加密与数据库实例的连接。有关对 MySQL 数据库实例使用 SSL/TLS 的信息,请参阅在 MySQL 数据库实例中使用 SSL

确定是否有任何应用程序使用 SSL 连接到 MySQL 数据库实例

如果您使用的是 Amazon RDS for MySQL 版本 5.7 或 8.0,并且启用了性能架构,请运行以下查询来检查连接使用的是否是 SSL/TLS。有关启用性能架构的信息,请参阅 MySQL 文档中的性能架构快速入门

mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;

在该示例输出中,您可以看到自己的会话 (admin) 以及作为 webapp1 登录的应用程序均在使用 SSL。

+----+-----------------+------------------+-----------------+ | id | user | host | connection_type | +----+-----------------+------------------+-----------------+ | 8 | admin | 10.0.4.249:42590 | SSL/TLS | | 4 | event_scheduler | localhost | NULL | | 10 | webapp1 | 159.28.1.1:42189 | SSL/TLS | +----+-----------------+------------------+-----------------+ 3 rows in set (0.00 sec)

如果您使用的是 Amazon RDS for MySQL 版本 5.5 或 5.6,则无法从服务器端确定应用程序是否使用 SSL 进行连接。对于这些版本,您可以通过检查应用程序的连接方法来确定是否使用了 SSL。您可以在下一节中找到有关检查客户端连接配置的更多信息。

确定客户端是否需要证书验证才能连接

您可以检查 JDBC 客户端和 MySQL 客户端是否需要证书验证才能连接。

JDBC

以下使用 MySQL Connector/J 8.0 的示例显示了一种方法,用于检查应用程序的 JDBC 连接属性以确定成功的连接是否需要有效证书。有关 MySQL 的所有 JDBC 连接选项的更多信息,请参阅 MySQL 文档中的配置属性

当使用 MySQL Connector/J 8.0 时,如果您的连接属性将 sslMode 设置为 VERIFY_CAVERIFY_IDENTITY,则 SSL 连接需要对服务器 CA 证书进行验证,如以下示例所示。

Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD);
注意

如果您使用 MySQL Java Connector v5.1.38 或更高版本或者 MySQL Java Connector v8.0.9 或更高版本连接到数据库,即使您没有明确配置应用程序在连接到数据库时使用 SSL/TLS,这些客户端驱动程序仍默认为使用 SSL/TLS。此外,在使用 SSL/TLS 时,它们会执行部分证书验证,如果数据库服务器证书过期,则无法连接。

MySQL

以下使用 MySQL 客户端的示例显示了两种方法,用于检查脚本的 MySQL 连接以确定成功的连接是否需要有效证书。有关 MySQL 客户端的所有连接选项的更多信息,请参阅 MySQL 文档中的加密连接的客户端配置

当使用 MySQL 5.7 或 MySQL 8.0 客户端时,如果对于 --ssl-mode 选项,您指定 VERIFY_CAVERIFY_IDENTITY,则 SSL 连接需要对服务器 CA 证书进行验证,如以下示例所示。

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA

当使用 MySQL 5.6 客户端时,如果您指定 --ssl-verify-server-cert 选项,则 SSL 连接需要对服务器 CA 证书进行验证,如以下示例所示。

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert

更新应用程序信任存储

有关更新 MySQL 应用程序的信任存储的信息,请参阅 MySQL 文档中的安装 SSL 证书

注意

更新信任存储时,除了添加新证书外,还可以保留较旧证书。

更新 JDBC 应用程序信任存储

您可以更新使用 JDBC 的应用程序的信任存储以进行 SSL/TLS 连接。

更新 JDBC 应用程序信任存储

  1. 下载适用于所有 AWS 区域的 2019 年根证书,并将此文件放在信任存储目录中。

    有关下载根证书的信息,请参阅 使用 SSL/TLS 加密与数据库实例的连接

  2. 使用以下命令将证书转换为 .der 格式。

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    将文件名替换为您下载的文件名。

  3. 使用以下命令将证书导入密钥存储。

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. 确认成功更新了密钥存储。

    keytool -list -v -keystore clientkeystore.jks

    在出现提示时,输入密钥存储密码。

    您的输出应包含以下内容。

    rds-root,date, trustedCertEntry, Certificate fingerprint (SHA1): D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96 # This fingerprint should match the output from the below command openssl x509 -fingerprint -in rds-ca-2019-root.pem -noout

如果在应用程序中使用 mysql JDBC 驱动程序,请在该应用程序中设置以下属性。

System.setProperty("javax.net.ssl.trustStore", certs); System.setProperty("javax.net.ssl.trustStorePassword", "password");

启动应用程序时,请设置以下属性。

java -Djavax.net.ssl.trustStore=/path_to_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication

用于建立 SSL 连接的示例 Java 代码

以下代码示例展示了如何设置使用 JDBC 验证服务器证书的 SSL 连接。

public class MySQLSSLTest { private static final String DB_USER = "username"; private static final String DB_PASSWORD = "password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore"; private static final String KEY_STORE_PASS = "keystore-password"; public static void test(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = null; Statement stmt = null; ResultSet rs = null; try { connection = DriverManager.getConnection("jdbc:mysql://mydatabase.123456789012.us-east-1.rds.amazonaws.com:3306",properties); stmt = connection.createStatement(); rs=stmt.executeQuery("SELECT 1 from dual"); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return; } }
重要

在确定了数据库连接使用 SSL/TLS 并更新了应用程序信任存储之后,可以更新数据库以使用 rds-ca-2019 证书。有关说明,请参阅通过修改数据库实例来更新 CA 证书中的步骤 3。