Aplicación de una versión de TLS mínima en AWS SDK para C++ - AWS SDK para C++

Aplicación de una versión de TLS mínima en AWS SDK para C++

Para aumentar la seguridad al comunicarse con los servicios de AWS, debe configurar SDK for C++ para usar TLS 1.2 o una versión posterior. Nosotros recomendamos TLS 1.3.

El AWS SDK para C++ es una biblioteca multiplataforma. Puede crear y ejecutar la aplicación en las plataformas que desee. Las diferentes plataformas pueden depender de distintos clientes HTTP subyacentes.

macOS, Linux, Android y otras plataformas distintas de Windows utilizan de forma predeterminada libcurl. Si la versión de libcurl es posterior a la 7.34.0, TLS 1.0 es la versión mínima que utilizan los clientes HTTP subyacentes.

En Windows, la biblioteca predeterminada es WinHTTP. Windows decide el protocolo que se utilizará entre los protocolos TLS 1.0, TLS 1.1, TLS 1.2 y TLS 1.3 disponibles. WinInet e IXMLHttpRequest2 son las otras dos opciones disponibles en Windows. Puedes configurar tu aplicación para reemplazar la biblioteca predeterminada durante CMake y en tiempo de ejecución. Para estos dos clientes HTTP, Windows también decide el protocolo seguro.

El AWS SDK para C++ también proporciona la flexibilidad necesaria para anular los clientes HTTP predeterminados. Por ejemplo, puede aplicar libcurl o usar los clientes HTTP que desee utilizando una fábrica de clientes HTTP personalizada. Por lo tanto, para usar TLS 1.2 como versión mínima, debe conocer la biblioteca de clientes HTTP que está usando.

Aplicación de una versión específica de TLS con libcurl en todas las plataformas

En esta sección se asume que el AWS SDK para C++ utiliza libcurl como una dependencia para la compatibilidad con el protocolo HTTP. Para especificar de forma explícita la versión de TLS, necesitará una versión de libcurl mínima de 7.34.0. Además, es posible que tenga que modificar el código fuente del AWS SDK para C++ y volver a crearlo después.

En este procedimiento, se muestra cómo llevar a cabo esas tareas.

Para aplicar TLS 1.2 con libcurl

  1. Compruebe que su instalación de libcurl tenga al menos la versión 7.34.0.

  2. Descargue el código de fuente para el AWS SDK para C++ en GitHub.

  3. Abra aws-cpp-sdk-core/source/http/curl/CurlHttpClient.cpp y busque las líneas siguientes.

    #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. Si es necesario, cambie el último parámetro de la llamada a la función de la siguiente manera.

    #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. Si ha realizado los cambios de código anteriores, compile e instale el AWS SDK para C++ según las instrucciones de https://github.com/aws/aws-sdk-cpp#building-the-sdk.

  6. En el cliente de servicio de la aplicación, habilite verifySSL en su configuración, si esta opción no se ha habilitado todavía.

Para aplicar TLS 1.3 con libcurl

Para aplicar el protocolo TLS 1.3, siga los pasos de la sección anterior para configurar la opciónCURL_SSLVERSION_TLSv1_3 en lugar de CURL_SSLVERSION_TLSv1_2.

Aplicación de una versión específica de TLS en Windows

Los siguientes procedimientos muestran cómo aplicar TLS 1.2 o TLS 1.3 con WinHTTP, WinInet o IXMLHTTPRequest2.

Requisito previo: determine la compatibilidad con TLS en Windows

Para aplicar TLS 1.2 o TLS 1.3 con WinHTTP

WinHTTP proporciona una API para establecer de forma explícita los protocolos seguros aceptables. Sin embargo, para poder configurar esto en tiempo de ejecución, debe modificar el código fuente del AWS SDK para C++ y volver a crearlo después.

  1. Descargue el código de fuente para el AWS SDK para C++ en GitHub.

  2. Abra aws-cpp-sdk-core/source/http/windows/WinHttpSyncHttpClient.cpp y busque las líneas siguientes.

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

    El indicador de la opción WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 se define si TLS 1.3 está presente en el sistema de compilación actual. Para obtener más información, consulte WINHTTP_OPTION_SECURE_PROTOCOLS y Compatibilidad con las versiones del protocolo TLS en el sitio web de Microsoft.

  3. Elija una de las opciones siguientes:

    • Para aplicar TLS 1.2:

      Según la directiva #else, cambie el valor de la variable flags del siguiente modo.

      DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
    • Para aplicar TLS 1.3:

      Según la directiva #if defined(WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3), cambie el valor de la variable flags del siguiente modo.

      DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
  4. Si ha realizado los cambios de código anteriores, compile e instale el AWS SDK para C++ según las instrucciones de https://github.com/aws/aws-sdk-cpp#building-the-sdk.

  5. En el cliente de servicio de la aplicación, habilite verifySSL en su configuración, si esta opción no se ha habilitado todavía.

Para aplicar TLS 1.2 con WinInet e IXMLHTTPRequest2

No hay ninguna API que especifique el protocolo seguro para las bibliotecas WinInet e IXMLHTTPRequest2. Por lo tanto, AWS SDK para C++ usa el protocolo predeterminado para el sistema operativo. Puede actualizar el registro de Windows para forzar el uso de TLS 1.2, como se muestra en el siguiente procedimiento. Sin embargo, tenga en cuenta que el resultado es un cambio global que afecta a todas las aplicaciones que dependen de Schannel.

  1. Abra el Editor del Registro y vaya a Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.

  2. Cree las siguientes subclaves, si no existen: TLS 1.0,, TLS 1.1, y TLS 1.2.

  3. En cada una de las subclaves, cree una subclave Client y otra Server.

  4. Cree las siguientes claves y valores.

    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 es la única clave que está establecida en 1. Si se establece esta clave en 1, hace que TLS 1.2 sea el único protocolo seguro aceptable.

Para aplicar TLS 1.3 con WinInet e IXMLHTTPRequest2

No hay ninguna API que especifique el protocolo seguro para las bibliotecas WinInet e IXMLHTTPRequest2. Por lo tanto, AWS SDK para C++ usa el protocolo predeterminado para el sistema operativo. Puede actualizar el registro de Windows para forzar el uso de TLS 1.3, como se muestra en el siguiente procedimiento. Sin embargo, tenga en cuenta que el resultado es un cambio global que afecta a todas las aplicaciones que dependen de Schannel.

  1. Abra el Editor del Registro y vaya a Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.

  2. Cree las siguientes subclaves, si no existen: TLS 1.0,, TLS 1.1, TLS 1.2 y TLS 1.3.

  3. En cada una de las subclaves, cree una subclave Client y otra Server.

  4. Cree las siguientes claves y valores.

    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 es la única clave que está establecida en 1. Si se establece esta clave en 1, hace que TLS 1.3 sea el único protocolo seguro aceptable.