Aplicar uma versão mínima do TLS no AWS SDK para C++ - AWS SDK para C++

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. Se a versão da libcurl for posterior à 7.34.0, o TLS 1.0 será a versão mínima usada pelos clientes HTTP subjacentes.

No caso do Windows, a biblioteca padrão é WinHttp. O Windows decide o protocolo real a ser usado entre os protocolos TLS 1.0, TLS 1.1, TLS 1.2 e TLS 1.3 disponíveis. WinINet e IXMLHttpRequest2 são as outras duas opções disponíveis no Windows. Você pode configurar sua aplicação para substituir a biblioteca padrão durante o CMake e no runtime. Para esses dois clientes HTTP, o Windows também decide o protocolo seguro.

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

  1. Verifique se a versão de sua instalação da libcurl é pelo menos a 7.34.0.

  2. Baixe o código-fonte do AWS SDK para C++ por meio do GitHub.

  3. Abra o arquivo aws-cpp-sdk-core/source/http/curl/CurlHttpClient.cpp e 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
  4. 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
  5. 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.

  6. Para o cliente de serviço em sua aplicação, habilite verifySSL na 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

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.

  1. Baixe o código-fonte do AWS SDK para C++ por meio do GitHub.

  2. Abra o arquivo aws-cpp-sdk-core/source/http/windows/WinHttpSyncHttpClient.cpp e 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_PROTOCOLS e o suporte à versão do protocolo TLS no site da Microsoft.

  3. Escolha uma das seguintes opções:

    • Para impor o TLS 1.2:

      De acordo com a diretiva #else, altere o valor da variável flags da 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ável flags da forma a seguir.

      DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
  4. 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.

  5. Para o cliente de serviço em sua aplicação, habilite verifySSL na 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.

  1. Abra o Editor de Registro e acesse Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.

  2. Se elas ainda não existirem, crie as seguintes subchaves: TLS 1.0,, TLS 1.1 e TLS 1.2.

  3. Em cada uma, crie as seguintes subchaves: Client e Server.

  4. 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 1

    Observe 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.

  1. Abra o Editor de Registro e acesse Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.

  2. Se elas ainda não existirem, crie as seguintes subchaves: TLS 1.0,, TLS 1.1, TLS 1.2 e TLS 1.3.

  3. Em cada uma, crie as seguintes subchaves: Client e Server.

  4. 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 1

    Observe 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.