

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# で最小 TLS バージョンを適用する AWS SDK for C\+\+
<a name="enforcing-tls"></a>

 AWS サービスと通信する際のセキュリティを強化するには、TLS 1.2 以降を使用するように SDK for C\+\+ を設定する必要があります。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、1.1、1.2、1.3 の中から使用する実際のプロトコルを決定します。Windows では、[WinINet](https://docs.microsoft.com/en-us/windows/win32/wininet) と [IXMLHttpRequest2](https://docs.microsoft.com/en-us/windows/win32/api/_ixhr2) という 2 つの選択肢もあります。CMake 中および実行時にデフォルトライブラリを置き換えるようにアプリケーションを設定できます。これら 2 つの HTTP クライアントに対しても、Windows が使用する安全なプロトコルを決定します。

は、デフォルトの HTTP クライアントを上書きする柔軟性 AWS SDK for C\+\+ も提供します。例えば、カスタム 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 上で実行している場合は、レジストリで TLS 1.2 のサポートが有効になっていることを確認する必要があります。詳細については、[https://docs.microsoft.com/ja-jp/windows-server/security/tls/tls-registry-settings\#tls-12](https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12) を参照してください。以前のディストリビューションを実行している場合は、オペレーティングシステムをアップグレードする必要があります。

### 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());
   }
   ```

   `WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3` オプションフラグは、TLS 1.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\+\+ はオペレーティングシステムのデフォルトを使用します。以下の手順に示すように、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 を適用するには
<a name="to-enforce-tls-1-3-with-wininet-and-ixmlhttprequest2"></a>

WinINet および IXMLHTTPRequest2 ライブラリには、安全なプロトコルを指定する API はありません。したがって、 AWS SDK for C\+\+ はオペレーティングシステムのデフォルトを使用します。以下の手順に示すように、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 のみが許容される安全なプロトコルとして適用されます。