Uso de una biblioteca libcrypto personalizada en el AWS SDK para C++ - AWS SDK para C++

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de una biblioteca libcrypto personalizada en el AWS SDK para C++

De forma predeterminada, el AWS SDK para C++ utiliza la biblioteca criptográfica del sistema predeterminada para la seguridad de la capa de transporte. Sin embargo, el SDK para C++ se puede configurar opcionalmente para usar una biblioteca libcrypto diferente al compilar el SDK desde el código fuente. Funcionalmente, esto significa que todas las operaciones criptográficas se desviarán a una implementación personalizada de OpenSSL. Por ejemplo, es posible que desee utilizar la biblioteca AWS-LC en modo FIPS para lograr un estándar FIPS en su aplicación.

Cómo compilar una libcrypto personalizada en el SDK para C++

Paso 1: Compile u obtenga su biblioteca libcrypto

AWS-LC es un ejemplo de una biblioteca libcrypto alternativa, pero cualquier distribución de OpenSSL o equivalente a OpenSSL funcionaría.

Tanto el SDK para C++ como su dependencia, el CRT, utilizan libcrypto para sus funciones criptográficas y ambos necesitan gestionar las dependencias de la misma manera. El SDK para C++ depende de dos clientes HTTP diferentes en función de si la solicitud utiliza la funcionalidad CRT S3 del SDK. El CRT depende específicamente de s2n, una implementación de TLS que se inicializa en el momento del inicio. Tanto el SDK como el equipo de s2n tienen un parámetro cmake para forzar el uso de una biblioteca libcrypto compartida, independientemente del valor de BUILD_SHARED_LIBS. Lo normal es que el cliente HTTP de CRT y el cliente HTTP normal usen la misma libcrypto. En este caso, eso significaría que ambos hacen referencia a OpenSSL en el árbol de dependencias. El SDK proporciona esto a través de AWS_USE_CRYPTO_SHARED_LIBS y s2n (para llamadas basadas en CRT) a través de S2N_USE_CRYPTO_SHARED_LIBS. La resolución de las dependencias es la misma entre estas dos bibliotecas y, por lo general, están configuradas para que coincidan, aunque puede configurarlas de forma explícita para que sean diferentes.

Por ejemplo, para usar AWS-LC como biblioteca libcrypto, debería compilarla de la siguiente manera:

git clone --depth 1 -b fips-2022-11-02 https://github.com/aws/aws-lc && \ cd aws-lc && \ mkdir build && \ cd build && \ cmake -G Ninja \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_INSTALL_PREFIX=/lc-install .. && \ cmake --build . && \ cmake --install . && \ rm -rf ./* && \ cmake -G Ninja \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_INSTALL_PREFIX=/lc-install .. && \ cmake --build . && \ cmake --install .

Paso 2: Compile curl desde el código fuente o utilice una distribución de curl con su biblioteca libcrypto

El SDK para C++ requiere que se instale un cliente HTTP en el sistema que se utilizará para realizar solicitudes HTTP. El cliente HTTP debe crearse con la libcrypto que vaya a utilizar. El cliente HTTP se encarga de las operaciones de TLS y, por lo tanto, utiliza su biblioteca libcrypto.

En el ejemplo siguiente, la biblioteca curl se reconstruye con una versión instalada de AWS-LC.

git clone --depth 1 -b curl-8_5_0 https://github.com/curl/curl && \ cd curl && \ autoreconf -fi && \ mkdir build && \ cd build && \ ../configure \ --enable-warnings \ --enable-werror \ --with-openssl=/lc-install \ --prefix=/curl-install && \ make && \ make install

Paso 3: Compile el SDK con las bibliotecas libcrypto y curl

El SDK para C++ ahora se puede compilar con los artefactos libcrypto y curl creados anteriormente. Esta compilación del SDK utilizará la biblioteca libcrypto personalizada para todas las funciones criptográficas.

git clone --depth 1 --recurse-submodules https://github.com/aws/aws-sdk-cpp \ cd aws-sdk-cpp && \ mkdir build && \ cd build && \ cmake -G Ninja \ -DCMAKE_PREFIX_PATH="/curl-install;/lc-install;" \ -DBUILD_ONLY="s3" \ -DCMAKE_INSTALL_PREFIX=/sdk-install \ -DAUTORUN_UNIT_TESTS=OFF .. && \ cmake --build . && \ cmake --install .

Veámoslo todo en una imagen de Docker

El siguiente ejemplo de archivo Docker muestra cómo implementar estos pasos en el entorno Amazon Linux 2023.

# User AL2023 Base image FROM public.ecr.aws/amazonlinux/amazonlinux:2023 # Install Dev Tools RUN yum groupinstall -y "Development Tools" RUN yum install -y cmake3 ninja-build # Build and install AWS-LC on the fips branch both statically and dynamically. RUN git clone --depth 1 -b fips-2022-11-02 https://github.com/aws/aws-lc && \\ cd aws-lc && \\ mkdir build && \\ cd build && \\ cmake -G Ninja \\ -DCMAKE_INSTALL_LIBDIR=lib \\ -DCMAKE_INSTALL_PREFIX=/lc-install .. && \\ cmake --build . && \\ cmake --install . && \\ rm -rf ./* && \\ cmake -G Ninja \\ -DBUILD_SHARED_LIBS=ON \\ -DCMAKE_INSTALL_LIBDIR=lib \\ -DCMAKE_INSTALL_PREFIX=/lc-install .. && \\ cmake --build . && \\ cmake --install . # Build and install curl targeting AWS-LC as openssl RUN git clone --depth 1 -b curl-8_5_0 https://github.com/curl/curl && \\ cd curl && \\ autoreconf -fi && \\ mkdir build && \\ cd build && \\ ../configure \\ --enable-warnings \\ --enable-werror \\ --with-openssl=/lc-install \\ --prefix=/curl-install && \\ make && \\ make install # Build and install SDK using the Curl and AWS-LC targets previously built RUN git clone --depth 1 --recurse-submodules https://github.com/aws/aws-sdk-cpp \\ cd aws-sdk-cpp && \\ mkdir build && \\ cd build && \\ cmake -G Ninja \\ -DCMAKE_PREFIX_PATH="/curl-install;/lc-install;" \\ -DBUILD_ONLY="s3" \\ -DCMAKE_INSTALL_PREFIX=/sdk-install \\ -DAUTORUN_UNIT_TESTS=OFF .. && \\ cmake --build . && \\ cmake --install .