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

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

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

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

注意

某些应用程序配置为仅在它们可以成功验证服务器上的证书时才连接到 SQL Server 数据库实例。

对于此类应用程序,您必须更新客户端应用程序信任存储,以包括新的 CA 证书。

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

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

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

检查数据库实例配置中 rds.force_ssl 参数的值。默认情况下,rds.force_ssl 参数设置为 0 (off)。如果 rds.force_ssl 参数设置为 1(开),则客户端需要使用 SSL/TLS 进行连接。有关参数组的更多信息,请参阅 使用数据库参数组。您还可以在 sys.dm_server_registry DMV 中找到此参数的设置。

运行以下查询来获取到数据库实例的所有打开的连接的当前加密选项。如果连接已加密,则列 ENCRYPT_OPTION 将返回 TRUE

select SESSION_ID, ENCRYPT_OPTION, NET_TRANSPORT, AUTH_SCHEME from SYS.DM_EXEC_CONNECTIONS

此查询仅显示当前连接。它没有显示过去已连接并断开连接的应用程序是否使用了 SSL。

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

您可以检查不同类型的客户端是否需要证书验证才能连接。

注意

如果您使用的连接器不是所列的连接器,请参阅特定连接器的文档以获取有关它如何执行加密连接的信息。有关更多信息,请参阅 Microsoft SQL Server 文档中的 Microsoft SQL 数据库的连接模块

SQL Server Management Studio

检查是否对 SQL Server Management Studio 连接进行了加密:

  1. 启动 SQL Server Management Studio。

  2. 连接到服务器输入服务器信息、登录用户名和密码。

  3. 选择 Options

  4. 在连接页面中检查是否选择了加密连接

有关 SQL Server Management Studio 的更多信息,请参阅使用 SQL Server Management Studio

sqlcmd

以下使用 sqlcmd 客户端的示例显示了如何检查脚本的 SQL Server 连接以确定成功的连接是否需要有效证书。有关更多信息,请参阅 Microsoft SQL Server 文档中的使用 sqlcmd 进行连接

当使用 sqlcmd 时,如果您使用 -N 命令参数对连接进行加密,则 SSL 连接需要对服务器证书进行验证,如以下示例所示。

$ sqlcmd -N -S dbinstance.rds.amazon.com -d ExampleDB
注意

如果 sqlcmd 是使用 -C 选项调用的,则它将信任服务器证书,即使该证书与客户端信任存储不匹配也是如此。

ADO.NET

在以下示例中,应用程序使用 SSL 进行连接,并且必须验证服务器证书。

using SQLC = Microsoft.Data.SqlClient; ... static public void Main() { using (var connection = new SQLC.SqlConnection( "Server=tcp:dbinstance.rds.amazon.com;" + "Database=ExampleDB;User ID=LOGIN_NAME;" + "Password=YOUR_PASSWORD;" + "Encrypt=True;TrustServerCertificate=False;" )) { connection.Open(); ... }

Java

在以下示例中,应用程序使用 SSL 进行连接,并且必须验证服务器证书。

String connectionUrl = "jdbc:sqlserver://dbinstance.rds.amazon.com;" + "databaseName=ExampleDB;integratedSecurity=true;" + "encrypt=true;trustServerCertificate=false";

要为使用 JDBC 进行连接的客户端启用 SSL 加密,您可能需要将 Amazon RDS 证书添加到 Java CA 证书存储。有关说明,请参阅 Microsoft SQL Server 文档中的配置客户端加密。您还可以通过将 trustStore=path-to-certificate-trust-store-file 附加到连接字符串来直接提供受信任的 CA 证书文件名。

注意

如果在连接字符串中使用 TrustServerCertificate=true(或其等效项),则连接过程将跳过信任链验证。在这种情况下,即使无法验证证书,应用程序也会连接。使用 TrustServerCertificate=false 执行证书验证,这是最佳实践。

更新应用程序信任存储

您可以更新使用 Microsoft SQL Server 的应用程序的信任存储。有关说明,请参阅加密特定连接。另请参阅 Microsoft SQL Server 文档中的配置客户端加密

如果您使用的操作系统不是 Microsoft Windows,请参阅 SSL/TLS 实现的软件分发文档,以获取有关添加新的根 CA 证书的信息。例如,OpenSSL 和 GnuTLS 是常用的选项。使用实现方法将信任添加到 RDS 根 CA 证书。Microsoft 提供了有关在某些系统上配置证书的说明。

注意

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

更新 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
重要

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