强制在适用于 C++ 的 AWS SDK中实施最低 TLS 版本 - 适用于 C++ 的 AWS SDK

强制在适用于 C++ 的 AWS SDK中实施最低 TLS 版本

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

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

默认情况下,macOS、Linux、Android 和其他非 Windows 平台使用 libcurl。如果 libcurl 版本高于 7.34.0,则 TLS 1.0 是底层 HTTP 客户端使用的最低版本。

对于 Windows,默认库是 WinHttp。Windows 会在可用的 TLS 1.0、TLS 1.1、TLS 1.2 和 TLS 1.3 协议中,决定实际使用的协议。WinINetIXMLHttpRequest2 是 Windows 上可用的另外两个选项。您可以将应用程序配置为在 CMake 期间和运行时替换默认库。对于这两个 HTTP 客户端,Windows 还会决定要使用的安全协议。

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

在所有平台上通过 libcurl 强制使用特定 TLS 版本

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

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

通过 libcurl 强制使用 TLS 1.2

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

  2. GitHub 下载适用于 C++ 的 AWS SDK 的源代码。

  3. 打开 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
  4. 如有必要,请按以下方式更改函数调用中的最后一个参数。

    #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
  5. 如果您执行了上述代码更改,请按照 https://github.com/aws/aws-sdk-cpp#building-the-sdk 上的说明构建和安装适用于 C++ 的 AWS SDK。

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

通过 libcurl 强制使用 TLS 1.3

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

在 Windows 上强制使用特定 TLS 版本

以下过程展示了如何对 WinHttp、WinINet 或 IXMLHTTPRequest2 强制使用 TLS 1.2 或 TLS 1.3。

先决条件:确定 Windows TLS 支持

强制对 WinHttp 使用 TLS 1.2 或 TLS 1.3

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

  1. GitHub 下载适用于 C++ 的 AWS SDK 的源代码。

  2. 打开 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_PROTOCOLSTLS 协议版本支持

  3. 选择下列选项之一:

    • 要强制使用 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;
  4. 如果您执行了上述代码更改,请按照 https://github.com/aws/aws-sdk-cpp#building-the-sdk 上的说明构建和安装适用于 C++ 的 AWS SDK。

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

对 WinINet 和 IXMLHTTPRequest2 强制使用 TLS 1.2

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

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

  2. 如果以下子项尚不存在,请创建它们:TLS 1.0,TLS 1.1TLS 1.2

  3. 在每个子项下,创建一个 Client 子项和一个 Server 子项。

  4. 创建以下项和值。

    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 作为唯一可接受的安全协议。

对 WinINet 和 IXMLHTTPRequest2 强制使用 TLS 1.3

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

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

  2. 如果以下子项尚不存在,请创建它们:TLS 1.0,TLS 1.1TLS 1.2TLS 1.3

  3. 在每个子项下,创建一个 Client 子项和一个 Server 子项。

  4. 创建以下项和值。

    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 作为唯一可接受的安全协议。