AWS SDK for C++ での最小 TLS バージョンの適用 - AWS SDK for C++

AWS SDK for C++ での最小 TLS バージョンの適用

AWS サービスと通信時のセキュリティを強化するには、TLS 1.2 以降を使用するように SDK for C++ を設定する必要があります。TLS 1.3 の使用をお勧めします。

AWS SDK for C++ はクロスプラットフォームのライブラリです。任意のプラットフォームでアプリケーションをビルドして実行できます。プラットフォームによって基盤 HTTP クライアントが異なる場合があります。

デフォルトでは、macOS、Linux、Android、およびその他の非 Windows プラットフォームは libcurl を使用します。libcurl のバージョンが 7.34.0 より後の場合、基盤 HTTP クライアントで使用される TLS の最小バージョンは 1.0 です。

Windows では、デフォルトのライブラリは WinHttp です。Windows は、TLS 1.0、1.1、1.2、1.3 の中から使用する実際のプロトコルを決定します。Windows では、WinINetIXMLHttpRequest2 という 2 つの選択肢もあります。CMake 中および実行時にデフォルトライブラリを置き換えるようにアプリケーションを設定できます。これら 2 つの HTTP クライアントに対しても、Windows が使用する安全なプロトコルを決定します。

AWS SDK for C++ は、デフォルトの HTTP クライアントをオーバーライドする柔軟性も提供します。例えば、カスタム HTTP クライアントファクトリを使用して、libcurl を適用したり、任意の HTTP クライアントを使用したりできます。そのため、TLS 1.2 を最小バージョンとして使用するには、使用している HTTP クライアントライブラリを把握しておく必要があります。

libcurl を使用してすべてのプラットフォームで特定の TLS バージョンを適用する

このセクションでは、AWS SDK for C++ が HTTP プロトコルのサポートに libcurl を依存関係として使用していることを前提としています。TLS バージョンを明示的に指定するには、libcurl のバージョンが 7.34.0 以降である必要があります。さらに、AWS SDK for C++ のソースコードを変更してから再ビルドする必要がある場合があります。

これらの作業の手順を次に示します。

libcurl で TLS 1.2 を適用するには

  1. libcurl のインストールがバージョン 7.34.0 以降であることを確認します。

  2. AWS SDK for C++ のソースコードを 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. 前述のコード変更を行った場合は、https://github.com/aws/aws-sdk-cpp#building-the-sdk の手順に従って AWS SDK for C++ をビルドしてインストールします。

  6. アプリケーションのサービスクライアントで、まだ有効になっていない場合は、クライアント設定で verifySSL を有効にします。

libcurl で TLS 1.3 を適用するには

TLS 1.3 を適用するには、前述のセクションの手順に従って、CURL_SSLVERSION_TLSv1_2 の代わりに CURL_SSLVERSION_TLSv1_3 オプションを設定します。

Windows で特定の TLS バージョンを適用する

以下の手順では、WinHttp WinINet 、または IXMLHTTPRequest2 を使用して TLS 1.2 または TLS 1.3 を適用する方法を示しています。

前提条件: Windows の TLS サポートを確認する

WinHttp で TLS 1.2 または TLS 1.3 を適用するには

WinHttp には、使用可能で安全なプロトコルを明示的に設定する API が用意されています。ただし、これを実行時に設定できるようにするには、AWS SDK for C++ のソースコードを変更してから再ビルドする必要があります。

  1. AWS SDK for C++ のソースコードを 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()); }

    WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 オプションフラグは、TLS 1.3 が現在のビルドシステムに存在する場合に定義されます。詳細については、Microsoft のウェブサイトで「WINHTTP_OPTION_SECURE_PROTOCOLS」および「TLS プロトコルバージョンのサポート」を参照してください。

  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. 前述のコード変更を行った場合は、https://github.com/aws/aws-sdk-cpp#building-the-sdk の手順に従って AWS SDK for C++ をビルドしてインストールします。

  5. アプリケーションのサービスクライアントで、まだ有効になっていない場合は、クライアント設定で verifySSL を有効にします。

WinINet と IXMLHTTPRequest2 で TLS 1.2 を適用するには

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

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