

# 更新应用程序以使用新的 SSL/TLS 证书连接到 Microsoft SQL Server 数据库实例
<a name="ssl-certificate-rotation-sqlserver"></a>

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

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

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

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

有关证书轮换的更多信息，请参阅[轮换 SSL/TLS 证书](UsingWithRDS.SSL-certificate-rotation.md)。有关下载证书的更多信息，请参阅[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。有关对 Microsoft SQL Server 数据库实例使用 SSL/TLS 的信息，请参阅[将 SSL 与 Microsoft SQL Server 数据库实例结合使用](SQLServer.Concepts.General.SSL.Using.md)。

**Topics**
+ [确定是否有任何应用程序使用 SSL 连接到 Microsoft SQL Server 数据库实例](#ssl-certificate-rotation-sqlserver.determining-server)
+ [确定客户端是否需要证书验证才能连接](#ssl-certificate-rotation-sqlserver.determining-client)
+ [更新应用程序信任存储](#ssl-certificate-rotation-sqlserver.updating-trust-store)

## 确定是否有任何应用程序使用 SSL 连接到 Microsoft SQL Server 数据库实例
<a name="ssl-certificate-rotation-sqlserver.determining-server"></a>

检查数据库实例配置中 `rds.force_ssl` 参数的值。默认情况下，`rds.force_ssl` 参数设置为 0 (off)。如果 `rds.force_ssl` 参数设置为 1（开），则客户端需要使用 SSL/TLS 进行连接。有关参数组的更多信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

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

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

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

## 确定客户端是否需要证书验证才能连接
<a name="ssl-certificate-rotation-sqlserver.determining-client"></a>

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

**注意**  
如果您使用的连接器不是所列的连接器，请参阅特定连接器的文档以获取有关它如何执行加密连接的信息。有关更多信息，请参阅 Microsoft SQL Server 文档中的 [Microsoft SQL 数据库的连接模块](https://docs.microsoft.com/en-us/sql/connect/sql-connection-libraries?view=sql-server-ver15)。

### SQL Server Management Studio
<a name="ssl-certificate-rotation-sqlserver.determining-client.management-studio"></a>

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

1. 启动 SQL Server Management Studio。

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

1. 选择 **Options**。

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

有关 SQL Server Management Studio 的更多信息，请参阅[使用 SQL Server Management Studio](http://msdn.microsoft.com/en-us/library/ms174173.aspx)。

### sqlcmd
<a name="ssl-certificate-rotation-sqlserver.determining-client.sqlcmd"></a>

以下使用 `sqlcmd` 客户端的示例显示了如何检查脚本的 SQL Server 连接以确定成功的连接是否需要有效证书。有关更多信息，请参阅 Microsoft SQL Server 文档中的[使用 sqlcmd 进行连接](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/connecting-with-sqlcmd?view=sql-server-ver15)。

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

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

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

### ADO.NET
<a name="ssl-certificate-rotation-sqlserver.determining-client.adonet"></a>

在以下示例中，应用程序使用 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
<a name="ssl-certificate-rotation-sqlserver.determining-client.java"></a>

在以下示例中，应用程序使用 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 文档中的[配置客户端加密](https://docs.microsoft.com/en-us/SQL/connect/jdbc/configuring-the-client-for-ssl-encryption?view=sql-server-2017)。您还可以通过将 `trustStore=path-to-certificate-trust-store-file` 附加到连接字符串来直接提供受信任的 CA 证书文件名。

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

## 更新应用程序信任存储
<a name="ssl-certificate-rotation-sqlserver.updating-trust-store"></a>

您可以更新使用 Microsoft SQL Server 的应用程序的信任存储。有关说明，请参阅 [加密特定连接](SQLServer.Concepts.General.SSL.Using.md#SQLServer.Concepts.General.SSL.Client)。另请参阅 Microsoft SQL Server 文档中的[配置客户端加密](https://docs.microsoft.com/en-us/SQL/connect/jdbc/configuring-the-client-for-ssl-encryption?view=sql-server-2017)。

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

有关下载根证书的信息，请参阅 [使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。

有关导入证书的示例脚本，请参阅 [将证书导入信任存储的示例脚本](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script)。

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