

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

# 在 中強制執行最低 TLS 版本 適用於 C\$1\$1 的 AWS SDK
強制執行最低 TLS 版本

若要在與 AWS 服務通訊時提高安全性，您應該將適用於 C\$1\$1 的 SDK 設定為使用 TLS 1.2 或更新版本。我們建議使用 TLS 1.3。

 適用於 C\$1\$1 的 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 通訊協定之間使用的實際通訊協定。[WinINet](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\$1\$1 的 AWS SDK 也提供覆寫預設 HTTP 用戶端的彈性。例如，您可以使用自訂 HTTP 用戶端工廠，強制執行 libcurl 或使用您想要的任何 HTTP 用戶端。因此，若要使用 TLS 1.2 作為最低版本，您必須知道您正在使用的 HTTP 用戶端程式庫。

## 在所有平台上使用 libcurl 強制執行特定 TLS 版本


本節假設 適用於 C\$1\$1 的 AWS SDK 使用 libcurl 做為 HTTP 通訊協定支援的相依性。若要明確指定 TLS 版本，您將需要 7.34.0 的最低 libcurl 版本。此外，您可能需要修改 適用於 C\$1\$1 的 AWS SDK 的原始程式碼，然後重建它。

下列程序說明如何執行這些任務。

### 使用 libcurl 強制執行 TLS 1.2


1. 確認您的 libcurl 安裝至少為 7.34.0 版。

1.  適用於 C\$1\$1 的 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. 如果您執行上述程式碼變更，請根據 https 適用於 C\$1\$1 的 AWS SDK ：//[https://github.com/aws/aws-sdk-cpp\$1building-the-sdk](https://github.com/aws/aws-sdk-cpp#building-the-sdk) 的說明建置並安裝 。

1. 對於應用程式中的服務用戶端，如果尚未啟用此選項，請在其用戶端組態`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：//[https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl–schannel-ssp- ](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\$1tls-12](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\$1\$1 的 AWS SDK 然後重建它。

1.  適用於 C\$1\$1 的 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\$1OPTION\$1SECURE\$1PROTOCOLS](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. 如果您執行上述程式碼變更，請根據 https 適用於 C\$1\$1 的 AWS SDK ：//[https://github.com/aws/aws-sdk-cpp\$1building-the-sdk](https://github.com/aws/aws-sdk-cpp#building-the-sdk) 的說明建置並安裝 。

1. 對於應用程式中的服務用戶端，如果尚未啟用此選項，請在其用戶端組態`verifySSL`中啟用 。

### 使用 WinINet 和 IXMLHTTPRequest2 強制執行 TLS 1.2


沒有 API 可指定 WinINet 和 IXMLHTTPRequest2 程式庫的安全通訊協定。因此， 適用於 C\$1\$1 的 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 作為唯一可接受的安全通訊協定。

### 使用 WinINet 和 IXMLHTTPRequest2 強制執行 TLS 1.3


沒有 API 可指定 WinINet 和 IXMLHTTPRequest2 程式庫的安全通訊協定。因此， 適用於 C\$1\$1 的 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 作為唯一可接受的安全通訊協定。