本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 中強制執行最低 TLS 版本 適用於 C++ 的 AWS SDK
若要在與 AWS 服務通訊時提高安全性,您應該將適用於 C++ 的 SDK 設定為使用 TLS 1.2 或更新版本。我們建議使用 TLS 1.3。
適用於 C++ 的 AWS SDK 是跨平台程式庫。您可以在您想要的平台上建置和執行應用程式。不同的平台可能取決於不同的基礎 HTTP 用戶端。
根據預設,macOS、Linux、Android 和其他非 Windows 平台會使用 libcurl
對於 Windows,預設程式庫為 WinHttp
適用於 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
-
確認您的 libcurl 安裝至少為 7.34.0 版。
-
適用於 C++ 的 AWS SDK 從 GitHub
下載 的原始程式碼。 -
開啟
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
-
如果您執行上述程式碼變更,請根據 適用於 C++ 的 AWS SDK https://https://github.com/aws/aws-sdk-cpp#building-the-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 支援
-
判斷您的系統可用的 TLS 通訊協定版本支援,如 https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl–schannel-ssp-
所述。 -
如果是在 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 然後重建它。
-
適用於 C++ 的 AWS SDK 從 GitHub
下載 的原始程式碼。 -
開啟
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;
-
-
如果您執行上述程式碼變更,請根據 適用於 C++ 的 AWS SDK https://https://github.com/aws/aws-sdk-cpp#building-the-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 作為唯一可接受的安全通訊協定。