

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 에서 최소 TLS 버전 적용 AWS SDK for C\+\+
<a name="enforcing-tls"></a>

 AWS 서비스와 통신할 때 보안을 강화하려면 TLS 1.2 이상을 사용하도록 C\+\+용 SDK를 구성해야 합니다. TLS 1.3 사용을 권장합니다.

 AWS SDK for C\+\+ 는 교차 플랫폼 라이브러리입니다. 원하는 플랫폼에서 애플리케이션을 빌드하고 실행할 수 있습니다. 플랫폼마다 서로 다른 기본 HTTP 클라이언트에 의존할 수 있습니다.

기본적으로 macOS, Linux, Android 및 기타 비 Windows 플랫폼에서는 [libcurl](https://curl.haxx.se/libcurl/)을 사용합니다. libcurl 버전이 7.34.0 이상인 경우 기본 HTTP 클라이언트에서 사용하는 최소 버전은 TLS 1.0입니다.

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에서 보안 프로토콜을 결정합니다.

 AWS SDK for C\+\+ 또한는 기본 HTTP 클라이언트를 재정의할 수 있는 유연성을 제공합니다. 예를 들어 사용자 지정 HTTP 클라이언트 팩토리를 사용하여 libcurl을 적용하거나 원하는 HTTP 클라이언트를 사용할 수 있습니다. TLS 1.2를 최소 버전으로 사용하려면 사용 중인 HTTP 클라이언트 라이브러리를 알고 있어야 합니다.

## 모든 플랫폼에서 libcurl을 사용하여 특정 TLS 버전 적용
<a name="enforce-tls-1-2-with-libcurl-on-all-platforms"></a>

이 섹션에서는 AWS SDK for C\+\+ 가 HTTP 프로토콜 지원의 종속성으로 libcurl을 사용하고 있다고 가정합니다. TLS 버전을 명시적으로 지정하려면 최소 libcurl 버전이 7.34.0이어야 합니다. 또한 AWS SDK for C\+\+ 의 소스 코드를 수정한 다음 다시 빌드해야 할 수도 있습니다.

다음 절차에서는 이러한 태스크를 수행하는 방법을 보여줍니다.

### libcurl을 사용하여 TLS 1.2를 적용하려면
<a name="to-enforce-tls-1-2-with-libcurl"></a>

1. libcurl 설치가 버전 7.34.0 이상인지 확인합니다.

1. [GitHub](http://github.com/aws/aws-sdk-cpp) AWS SDK for C\+\+ 에서의 소스 코드를 다운로드합니다.

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://github.com/aws/aws-sdk-cpp\#building-the-sdk](https://github.com/aws/aws-sdk-cpp#building-the-sdk)에 있는 지침에 따라 AWS SDK for C\+\+ 를 빌드하고 설치합니다.

1. 애플리케이션의 서비스 클라이언트에 대해, 클라이언트 구성에서 `verifySSL` 옵션을 활성화합니다(해당 옵션이 아직 활성화되지 않은 경우).

### libcurl을 사용하여 TLS 1.3을 적용하려면
<a name="to-enforce-tls-1-3-with-libcurl"></a>

TLS 1.3을 적용하려면 앞 섹션의 단계를 따르되 `CURL_SSLVERSION_TLSv1_2` 대신 `CURL_SSLVERSION_TLSv1_3` 옵션을 설정합니다.

## Windows에서 특정 TLS 버전 적용
<a name="enforce-tls-1-2-on-windows"></a>

다음 절차에서는 WinHttp, WinINet 또는 IXMLHTTPRequest2를 사용하여 TLS 1.2 또는 TLS 1.3을 적용하는 방법을 보여줍니다.

### 사전 조건: Windows TLS 지원 결정
<a name="prerequisite-enable-tls-1-1-and-1-2-on-windows"></a>
+ [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-)에 설명된 대로 시스템에 사용할 수 있는 TLS 프로토콜 버전 지원을 결정합니다.
+ Windows 7 SP1 또는 Windows Server 2008 R2 SP1에서 실행하는 경우 [https://docs.microsoft.com/ko-kr/windows-server/security/tls/tls-registry-settings\#tls-12](https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12)에 설명된 대로 레지스트리에서 TLS 1.2 지원이 활성화되어 있는지 확인해야 합니다. 이전 배포를 실행 중인 경우 운영 체제를 업그레이드해야 합니다.

### WinHttp을 사용해 TLS 1.2 또는 TLS 1.3을 적용하려면
<a name="to-enforce-tls-1-2-with-winhttp"></a>

WinHttp는 허용 가능한 보안 프로토콜을 명시적으로 설정하는 API를 제공합니다. 그러나 런타임 시에 이를 구성 가능하게 하려면 AWS SDK for C\+\+ 의 소스 코드를 수정한 다음 다시 빌드해야 합니다.

1. [GitHub](http://github.com/aws/aws-sdk-cpp) AWS SDK for C\+\+ 에서의 소스 코드를 다운로드합니다.

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\_OPTION\_SECURE\_PROTOCOLS](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://github.com/aws/aws-sdk-cpp\#building-the-sdk](https://github.com/aws/aws-sdk-cpp#building-the-sdk)에 있는 지침에 따라 AWS SDK for C\+\+ 를 빌드하고 설치합니다.

1. 애플리케이션의 서비스 클라이언트에 대해, 클라이언트 구성에서 `verifySSL` 옵션을 활성화합니다(해당 옵션이 아직 활성화되지 않은 경우).

### WinINet 및 IXMLHTTPRequest2를 사용하여 TLS 1.2를 적용하려면
<a name="to-enforce-tls-1-2-with-wininet-and-ixmlhttprequest2"></a>

WinINet 및 IXMLHTTPRequest2 라이브러리에 대한 보안 프로토콜을 지정하는 API는 없습니다. 따라서는 운영 체제의 기본값을 AWS SDK for C\+\+ 사용합니다. 다음 절차에 따라 TLS 1.2 사용을 강제 적용하도록 Windows 레지스트리를 업데이트할 수 있습니다. 다만, 그 결과는 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을 적용하려면
<a name="to-enforce-tls-1-3-with-wininet-and-ixmlhttprequest2"></a>

WinINet 및 IXMLHTTPRequest2 라이브러리에 대한 보안 프로토콜을 지정하는 API는 없습니다. 따라서는 운영 체제의 기본값을 AWS SDK for C\+\+ 사용합니다. 다음 절차에 따라 TLS 1.3 사용을 강제 적용하도록 Windows 레지스트리를 업데이트할 수 있습니다. 다만, 그 결과는 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만 유일하게 허용되는 보안 프로토콜로 적용됩니다.