在 中強制執行最低 TLS 版本 適用於 C++ 的 AWS SDK - 適用於 C++ 的 AWS SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 中強制執行最低 TLS 版本 適用於 C++ 的 AWS SDK

若要在與 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 用戶端的彈性。例如,您可以強制執行 libcurl,或使用自訂 HTTP 用戶端工廠來使用任何您想要的 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. 適用於 C++ 的 AWS SDK 從 GitHub 下載 的原始程式碼。

  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. 如果您執行上述程式碼變更,請根據 適用於 C++ 的 AWS SDK https://https://github.com/aws/aws-sdk-cpp#building-the-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. 適用於 C++ 的 AWS SDK 從 GitHub 下載 的原始程式碼。

  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. 如果您執行上述程式碼變更,請根據 適用於 C++ 的 AWS SDK https://https://github.com/aws/aws-sdk-cpp#building-the-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 作為唯一可接受的安全通訊協定。