强制在适用于 C++ 的 AWS SDK中实施最低 TLS 版本
要提高与 AWS 服务通信时的安全性,您应将适用于 C++ 的 SDK 配置为使用 TLS 1.2 或更高版本。我们建议使用 TLS 1.3。
适用于 C++ 的 AWS SDK 是一个跨平台的库。您可以在所需平台上构建并运行您的应用程序。不同的平台可能依赖于不同的底层 HTTP 客户端。
默认情况下,macOS、Linux、Android 和其他非 Windows 平台使用 libcurl
对于 Windows,默认库是 WinHttp
适用于 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
-
确认您安装的 libcurl 版本至少为 7.34.0。
-
从 GitHub
下载适用于 C++ 的 AWS SDK 的源代码。 -
打开
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 -
如有必要,请按以下方式更改函数调用中的最后一个参数。
#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 -
如果您执行了上述代码更改,请按照 https://github.com/aws/aws-sdk-cpp#building-the-sdk
上的说明构建和安装适用于 C++ 的 AWS SDK。 -
对于应用程序中的服务客户端,如果
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 支持
-
按照 https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl–schannel-ssp-
中所述,确定您的系统支持的 TLS 协议版本。 -
如果您正在 Windows 7 SP1 或 Windows Server 2008 R2 SP1 上运行,则需要确保在注册表中启用 TLS 1.2 支持,如 https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12
所述。如果您正在运行较早的发行版,则必须升级操作系统。
强制对 WinHttp 使用 TLS 1.2 或 TLS 1.3
WinHttp 提供了一个 API 来明确设置可接受的安全协议。但是,若要在运行时配置此功能,您需要修改适用于 C++ 的 AWS SDK 的源代码,然后重新构建它。
-
从 GitHub
下载适用于 C++ 的 AWS SDK 的源代码。 -
打开
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和 TLS 协议版本支持 。 -
选择下列选项之一:
-
要强制使用 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;
-
-
如果您执行了上述代码更改,请按照 https://github.com/aws/aws-sdk-cpp#building-the-sdk
上的说明构建和安装适用于 C++ 的 AWS SDK。 -
对于应用程序中的服务客户端,如果
verifySSL尚未启用,请在其客户端配置中启用此选项。
对 WinINet 和 IXMLHTTPRequest2 强制使用 TLS 1.2
没有 API 可用于为 WinINet 和 IXMLHTTPRequest2 库指定安全协议。因此,适用于 C++ 的 AWS SDK 使用操作系统的默认值。您可以更新 Windows 注册表以强制使用 TLS 1.2,如以下过程所示。但请注意,结果是全局性更改,会影响所有依赖于 Schannel 的应用程序。
-
打开注册表编辑器并转到
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols。 -
如果以下子项尚不存在,请创建它们:
TLS 1.0,、TLS 1.1和TLS 1.2。 -
在每个子项下,创建一个
Client子项和一个Server子项。 -
创建以下项和值。
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 的应用程序。
-
打开注册表编辑器并转到
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols。 -
如果以下子项尚不存在,请创建它们:
TLS 1.0,、TLS 1.1、TLS 1.2和TLS 1.3。 -
在每个子项下,创建一个
Client子项和一个Server子项。 -
创建以下项和值。
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 作为唯一可接受的安全协议。