Aplicar uma versão mínima do TLS no AWS SDK para C++
Para aumentar a segurança ao comunicar-se com serviços da AWS, você deve configurar o SDK para C++ usar o TLS 1.2 ou posterior. Recomendamos utilizar o TLS 1.3.
O AWS SDK para C++ é uma biblioteca multiplataforma. É possível compilar e executar sua aplicação nas plataformas desejadas. Plataformas diferentes podem depender de diferentes clientes HTTP subjacentes.
Por padrão, macOS, Linux, Android e outras plataformas não Windows usam libcurl
No caso do Windows, a biblioteca padrão é WinHttp
O AWS SDK para C++ também oferece a flexibilidade de substituir os clientes HTTP padrão. Por exemplo, você pode aplicar a libcurl ou usar os clientes HTTP que quiser usando uma fábrica de clientes HTTP personalizados. Portanto, para usar o TLS 1.2 como a versão mínima, você deve saber qual biblioteca cliente HTTP está usando.
Impor uma versão TLS específica com libcurl em todas as plataformas
Esta seção pressupõe que o AWS SDK para C++ esteja usando libcurl como uma dependência para suporte ao protocolo HTTP. Para especificar explicitamente a versão do TLS, você precisará de uma versão libcurl mínima de 7.34.0. Além disso, talvez seja necessário modificar o código-fonte do AWS SDK para C++ e depois recompilá-lo.
O procedimento a seguir mostra como realizar essas tarefas.
Como impor o TLS 1.2 com libcurl
-
Verifique se a versão de sua instalação da libcurl é pelo menos a 7.34.0.
-
Baixe o código-fonte do AWS SDK para C++ por meio do GitHub
. -
Abra o arquivo
aws-cpp-sdk-core/source/http/curl/CurlHttpClient.cppe encontre as linhas de código a seguir.#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 -
Se necessário, altere o último parâmetro na chamada da função da maneira a seguir.
#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 -
Se você realizou as alterações de código anteriores, compile e instale o AWS SDK para C++ acordo com as instruções em https://github.com/aws/aws-sdk-cpp#building-the-sdk
. -
Para o cliente de serviço em sua aplicação, habilite
verifySSLna configuração do cliente, se essa opção ainda não estiver habilitada.
Como impor o TLS 1.3 com libcurl
Para impor o TLS 1.3, siga as etapas na seção anterior, definindo a opção CURL_SSLVERSION_TLSv1_3 em vez de CURL_SSLVERSION_TLSv1_2.
Impor uma versão específica do TLS no Windows
Os procedimentos a seguir mostram como impor o TLS 1.2 ou o TLS 1.3 com WinHttp, WinINet ou IXMLHTTPRequest2.
Pré-requisito: determinar o suporte ao TLS no Windows
-
Determine o suporte à versão do protocolo TLS disponível para seu sistema, conforme descrito em https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl–schannel-ssp-
. -
Caso esteja executando o Windows 7 SP1 ou o Windows Server 2008 R2 SP1, você precisa garantir que o suporte para TLS 1.2 esteja habilitado no registro, conforme descrito em https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12
. Se estiver executando uma distribuição anterior, você deverá atualizar seu sistema operacional.
Como impor o TLS 1.2 ou TLS 1.3 com WinHttp
O WinHttp fornece uma API para definir explicitamente os protocolos seguros aceitáveis. No entanto, para tornar isso configurável no runtime, você precisa modificar o código-fonte do AWS SDK para C++ e depois recompilá-lo.
-
Baixe o código-fonte do AWS SDK para C++ por meio do GitHub
. -
Abra o arquivo
aws-cpp-sdk-core/source/http/windows/WinHttpSyncHttpClient.cppe encontre as linhas de código a seguir.#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()); }O sinalizador de opção
WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3é definido caso o TLS 1.3 esteja presente no sistema de compilação atual. Para acessar mais informações, consulte WINHTTP_OPTION_SECURE_PROTOCOLSe o suporte à versão do protocolo TLS no site da Microsoft. -
Escolha uma das seguintes opções:
-
Para impor o TLS 1.2:
De acordo com a diretiva
#else, altere o valor da variávelflagsda forma a seguir.DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2; -
Para impor o TLS 1.3:
De acordo com a diretiva
#if defined(WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3), altere o valor da variávelflagsda forma a seguir.DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
-
-
Se você realizou as alterações de código anteriores, compile e instale o AWS SDK para C++ acordo com as instruções em https://github.com/aws/aws-sdk-cpp#building-the-sdk
. -
Para o cliente de serviço em sua aplicação, habilite
verifySSLna configuração do cliente, se essa opção ainda não estiver habilitada.
Como impor o TLS 1.2 com WinINet e IXMLHTTPRequest2
Não há API para especificar o protocolo seguro para as bibliotecas WinINet e IXMLHTTPRequest2. Portanto, o AWS SDK para C++ usa o padrão para o sistema operacional. Você pode atualizar o Registro do Windows para impor o uso do TLS 1.2, conforme mostrado no procedimento a seguir. No entanto, saiba que o resultado é uma mudança global que afeta todas as aplicações que dependem do Schannel.
-
Abra o Editor de Registro e acesse
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. -
Se elas ainda não existirem, crie as seguintes subchaves:
TLS 1.0,,TLS 1.1eTLS 1.2. -
Em cada uma, crie as seguintes subchaves:
ClienteServer. -
Crie as chaves e os valores a seguir.
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 1Observe que
TLS 1.2\Client\Enabledé a única chave definida como 1. Definir essa chave como 1 impõe o TLS 1.2 como o único protocolo seguro aceitável.
Como impor o TLS 1.3 com WinINet e IXMLHTTPRequest2
Não há API para especificar o protocolo seguro para as bibliotecas WinINet e IXMLHTTPRequest2. Portanto, o AWS SDK para C++ usa o padrão para o sistema operacional. Você pode atualizar o Registro do Windows para impor o uso do TLS 1.3, conforme mostrado no procedimento a seguir. No entanto, saiba que o resultado é uma mudança global que afeta todas as aplicações que dependem do Schannel.
-
Abra o Editor de Registro e acesse
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. -
Se elas ainda não existirem, crie as seguintes subchaves:
TLS 1.0,,TLS 1.1,TLS 1.2eTLS 1.3. -
Em cada uma, crie as seguintes subchaves:
ClienteServer. -
Crie as chaves e os valores a seguir.
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 1Observe que
TLS 1.3\Client\Enabledé a única chave definida como 1. Definir essa chave como 1 impõe o TLS 1.3 como o único protocolo seguro aceitável.