

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在中强制使用最低 TLS 版本 适用于 C\+\+ 的 AWS SDK
<a name="enforcing-tls"></a>

为了提高与 AWS 服务通信时的安全性，应将适用于 C\+\+ 的 SDK 配置为使用 TLS 1.2 或更高版本。我们建议使用 TLS 1.3。

 适用于 C\+\+ 的 AWS SDK 是一个跨平台库。您可以在所需平台上构建并运行您的应用程序。不同的平台可能依赖于不同的底层 HTTP 客户端。

默认情况下，macOS、Linux、Android 和其他非 Windows 平台使用 [libcurl](https://curl.haxx.se/libcurl/)。如果 libcurl 版本高于 7.34.0，则 TLS 1.0 是底层 HTTP 客户端使用的最低版本。

对于 Windows，默认库为[WinHttp](https://docs.microsoft.com/en-us/windows/win32/winhttp)。Windows 会在可用的 TLS 1.0、TLS 1.1、TLS 1.2 和 TLS 1.3 协议中，决定实际使用的协议。[Win INet](https://docs.microsoft.com/en-us/windows/win32/wininet) 和 [IXMLHttpRequest2](https://docs.microsoft.com/en-us/windows/win32/api/_ixhr2) 是 Windows 上可用的另外两个选项。您可以将应用程序配置为在运行期间 CMake 和运行时替换默认库。对于这两个 HTTP 客户端，Windows 还会决定要使用的安全协议。

 适用于 C\+\+ 的 AWS SDK 还提供了覆盖默认 HTTP 客户端的灵活性。例如，您可以使用自定义 HTTP 客户端工厂强制执行 libcurl 或使用任何所需的 HTTP 客户端。因此，要使用 TLS 1.2 作为最低版本，您必须知道您正在使用的 HTTP 客户端库。

## 在所有平台上通过 libcurl 强制使用特定 TLS 版本
<a name="enforce-tls-1-2-with-libcurl-on-all-platforms"></a>

本节假设使用 libcurl 作为 HTTP 协议支持的依赖项。 适用于 C\+\+ 的 AWS SDK 要明确指定 TLS 版本，您需要的最低 libcurl 版本为 7.34.0。此外，您可能还需要修改 适用于 C\+\+ 的 AWS SDK 的源代码，然后对其进行重新构建。

以下过程展示了如何执行这些任务。

### 通过 libcurl 强制使用 TLS 1.2
<a name="to-enforce-tls-1-2-with-libcurl"></a>

1. 确认您安装的 libcurl 版本至少为 7.34.0。

1.  适用于 C\+\+ 的 AWS SDK 从中下载源代码[GitHub](http://github.com/aws/aws-sdk-cpp)。

1. 打开 `aws-cpp-sdk-core/source/http/curl/CurlHttpClient.cpp`，然后找到以下代码行。

   ```
   #if LIBCURL_VERSION_MAJOR >= 7
   #if LIBCURL_VERSION_MINOR >= 34
   curl_easy_setopt(connectionHandle, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
   #endif //LIBCURL_VERSION_MINOR
   #endif //LIBCURL_VERSION_MAJOR
   ```

1. 如有必要，请按以下方式更改函数调用中的最后一个参数。

   ```
   #if LIBCURL_VERSION_MAJOR >= 7
   #if LIBCURL_VERSION_MINOR >= 34
   curl_easy_setopt(connectionHandle, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
   #endif //LIBCURL_VERSION_MINOR
   #endif //LIBCURL_VERSION_MAJOR
   ```

1. 如果您执行了上述代码更改，请 适用于 C\+\+ 的 AWS SDK 按照 [https://github.com/aws/aws-sdk-cpp\#](https://github.com/aws/aws-sdk-cpp#building-the-sdk) 中的说明进行构建和安装building-the-sdk。

1. 对于应用程序中的服务客户端，如果 `verifySSL` 尚未启用，请在其客户端配置中启用此选项。

### 通过 libcurl 强制使用 TLS 1.3
<a name="to-enforce-tls-1-3-with-libcurl"></a>

要强制使用 TLS 1.3，请按照前一节中的步骤操作，但要设置 `CURL_SSLVERSION_TLSv1_3` 选项，而不是 `CURL_SSLVERSION_TLSv1_2`。

## 在 Windows 上强制使用特定 TLS 版本
<a name="enforce-tls-1-2-on-windows"></a>

以下过程向您展示了如何使用 WinHttp、Win INet 或强制执行 TLS 1.2 或 TLS 1.3 IXMLHTTPRequest2。

### 先决条件：确定 Windows TLS 支持
<a name="prerequisite-enable-tls-1-1-and-1-2-on-windows"></a>
+ 按照 [https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl —schannel-s](https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-) sp-中所述，确定您的系统可用的 TLS 协议版本支持。
+ 如果你在 Windows 7 SP1 或 Windows Server 2008 R2 上运行 SP1，则需要确保注册表中启用 TLS 1.2 支持，如 windows [server/security/tls/tls-注册表设置 https://docs.microsoft.com/en-us/ \#tls-](https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12) 12 中所述。如果您正在运行较早的发行版，则必须升级操作系统。

### 使用 TLS 1.2 或 TLS 1.3 WinHttp
<a name="to-enforce-tls-1-2-with-winhttp"></a>

WinHttp 提供了一个 API 来明确设置可接受的安全协议。但是，若要在运行时配置此功能，您需要修改 适用于 C\+\+ 的 AWS SDK 的源代码，然后重新构建它。

1.  适用于 C\+\+ 的 AWS SDK 从中下载源代码[GitHub](http://github.com/aws/aws-sdk-cpp)。

1. 打开 `aws-cpp-sdk-core/source/http/windows/WinHttpSyncHttpClient.cpp`，然后找到以下代码行。

   ```
   #if defined(WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3)
       DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 |
               WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
   #else
       DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
   #endif
   
   if (!WinHttpSetOption(GetOpenHandle(), WINHTTP_OPTION_SECURE_PROTOCOLS, &flags, sizeof(flags)))
   {
       AWS_LOGSTREAM_FATAL(GetLogTag(), "Failed setting secure crypto protocols with error code: " << GetLastError());
   }
   ```

   如果当前构建系统上存在 TLS 1.3，则会定义 `WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3` 选项标志。有关更多信息，请参阅 Microsoft 网站上的 [WINHTTP\_OPTION\_SECURE\_PROTOCOLS](https://learn.microsoft.com/en-us/windows/win32/winhttp/option-flags#winhttp_option_secure_protocols) 和 [TLS 协议版本支持](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-#tls-protocol-version-support)。

1. 选择下列选项之一：
   + **要强制使用 TLS 1.2，请执行以下操作：**

     在 `#else` 指令下，按如下方式更改 `flags` 变量的值。

     ```
     DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
     ```
   + **要强制使用 TLS 1.3，请执行以下操作：**

     在 `#if defined(WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3)` 指令下，按如下方式更改 `flags` 变量的值。

     ```
     DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
     ```

1. 如果您执行了上述代码更改，请 适用于 C\+\+ 的 AWS SDK 按照 [https://github.com/aws/aws-sdk-cpp\#](https://github.com/aws/aws-sdk-cpp#building-the-sdk) 中的说明进行构建和安装building-the-sdk。

1. 对于应用程序中的服务客户端，如果 `verifySSL` 尚未启用，请在其客户端配置中启用此选项。

### 使用 Win 强制执行 TLS 1.2 INet 和 IXMLHTTPRequest2
<a name="to-enforce-tls-1-2-with-wininet-and-ixmlhttprequest2"></a>

没有 API 可以为 Win INet 和 IXMLHTTPRequest2库指定安全协议。因此， 适用于 C\+\+ 的 AWS SDK 使用操作系统的默认值。您可以更新 Windows 注册表以强制使用 TLS 1.2，如以下过程所示。但请注意，结果是全局性更改，会影响所有依赖于 Schannel 的应用程序。

1. 打开注册表编辑器并转到 `Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols`。

1. 如果以下子项尚不存在，请创建它们：`TLS 1.0,`、`TLS 1.1` 和 `TLS 1.2`。

1. 在每个子项下，创建一个 `Client` 子项和一个 `Server` 子项。

1. 创建以下项和值。

   ```
    Key name                          Key type   Value
    --------                          ---------  -----
    TLS 1.0\Client\DisabledByDefault  DWORD      0
    TLS 1.1\Client\DisabledByDefault  DWORD      0
    TLS 1.2\Client\DisabledByDefault  DWORD      0
    TLS 1.0\Client\Enabled            DWORD      0
    TLS 1.1\Client\Enabled            DWORD      0
    TLS 1.2\Client\Enabled            DWORD      1
   ```

   请注意，`TLS 1.2\Client\Enabled` 是唯一设置为 1 的项。将此项设置为 1 会强制将 TLS 1.2 作为唯一可接受的安全协议。

### 使用 Win 强制执行 TLS 1.3 INet 和 IXMLHTTPRequest2
<a name="to-enforce-tls-1-3-with-wininet-and-ixmlhttprequest2"></a>

没有 API 可以为 Win INet 和 IXMLHTTPRequest2库指定安全协议。因此， 适用于 C\+\+ 的 AWS SDK 使用操作系统的默认值。您可以更新 Windows 注册表以强制使用 TLS 1.3，如以下过程所示。但请注意，结果是全局性更改，会影响所有依赖于 Schannel 的应用程序。

1. 打开注册表编辑器并转到 `Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols`。

1. 如果以下子项尚不存在，请创建它们：`TLS 1.0,`、`TLS 1.1`、`TLS 1.2` 和 `TLS 1.3`。

1. 在每个子项下，创建一个 `Client` 子项和一个 `Server` 子项。

1. 创建以下项和值。

   ```
    Key name                          Key type   Value
    --------                          ---------  -----
    TLS 1.0\Client\DisabledByDefault  DWORD      0
    TLS 1.1\Client\DisabledByDefault  DWORD      0
    TLS 1.2\Client\DisabledByDefault  DWORD      0
    TLS 1.3\Client\DisabledByDefault  DWORD      0
    TLS 1.0\Client\Enabled            DWORD      0
    TLS 1.1\Client\Enabled            DWORD      0
    TLS 1.2\Client\Enabled            DWORD      0
    TLS 1.3\Client\Enabled            DWORD      1
   ```

   请注意，`TLS 1.3\Client\Enabled` 是唯一设置为 1 的项。将此项设置为 1 会强制将 TLS 1.3 作为唯一可接受的安全协议。