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
Windows では、デフォルトのライブラリは WinHttp
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 を適用するには
-
libcurl のインストールがバージョン 7.34.0 以降であることを確認します。
-
AWS SDK for C++ のソースコードを 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 -
前述のコード変更を行った場合は、https://github.com/aws/aws-sdk-cpp#building-the-sdk
の手順に従って AWS SDK for C++ をビルドしてインストールします。 -
アプリケーションのサービスクライアントで、まだ有効になっていない場合は、クライアント設定で
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 サポートを確認する
-
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
を参照してください。以前のディストリビューションを実行している場合は、オペレーティングシステムをアップグレードする必要があります。
WinHttp で TLS 1.2 または TLS 1.3 を適用するには
WinHttp には、使用可能で安全なプロトコルを明示的に設定する API が用意されています。ただし、これを実行時に設定できるようにするには、AWS SDK for C++ のソースコードを変更してから再ビルドする必要があります。
-
AWS SDK for C++ のソースコードを 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()); }WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3オプションフラグは、TLS 1.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;
-
-
前述のコード変更を行った場合は、https://github.com/aws/aws-sdk-cpp#building-the-sdk
の手順に従って AWS SDK for C++ をビルドしてインストールします。 -
アプリケーションのサービスクライアントで、まだ有効になっていない場合は、クライアント設定で
verifySSLを有効にします。
WinINet と IXMLHTTPRequest2 で TLS 1.2 を適用するには
WinINet および IXMLHTTPRequest2 ライブラリには、安全なプロトコルを指定する API はありません。そのため、AWS SDK for C++ はオペレーティングシステムのデフォルトを使用します。以下の手順に示すように、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 1TLS 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 に依存するすべてのアプリケーションに影響するグローバルな変更であることに注意してください。
-
レジストリエディターを開き、
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 1TLS 1.3\Client\Enabledだけが 1 に設定されているキーであることに注意してください。このキーを 1 に設定することで、TLS 1.3 のみが許容される安全なプロトコルとして適用されます。