在适用于 C++ 的 AWS SDK 中使用自定义 libcrypto 库 - 适用于 C++ 的 AWS SDK

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在适用于 C++ 的 AWS SDK 中使用自定义 libcrypto 库

默认情况下,适用于 C++ 的 AWS SDK 使用默认的系统加密库来保护传输层安全。但是,从源代码构建 SDK 时,可以选择将适用于 C++ 的 SDK 配置为使用不同的 libcrypto 库。从功能上讲,这意味着所有加密操作都将转由 OpenSSL 的自定义实现来处理。例如,您可能想在 FIPS 模式下使用 AWS-LC 库,以便在应用程序中实现 FIPS 标准。

如何将自定义 libcrypto 集成到适用于 C++ 的 SDK 中

第 1 步:构建或获取 libcrypto 库

AWS-LC 是替代 libcrypto 库的一个示例,但任何 OpenSSL 发行版或与 OpenSSL 兼容的库均可使用。

适用于 C++ 的 SDK 及其依赖项 CRT 均使用 libcrypto 来实现加密功能,且两者需要以相同的方式处理依赖项。适用于 C++ 的 SDK 依赖于两个不同的 HTTP 客户端,具体取决于请求是否使用 SDK 的 CRT S3 功能。具体来说,CRT 依赖于 s2n,这是一种在启动时初始化的 TLS 实现。SDK 和 s2n 团队均提供了一个 cmake 参数,该参数强制使用共享的 libcrypto 库,而不考虑 BUILD_SHARED_LIBS 的值。通常,您希望 CRT HTTP 客户端和常规 HTTP 客户端使用相同的 libcrypto。在这种情况下,这意味着两者都在依赖项树中引用 OpenSSL。SDK 通过 AWS_USE_CRYPTO_SHARED_LIBS 提供此功能,而 s2n(用于基于 CRT 的调用)通过 S2N_USE_CRYPTO_SHARED_LIBS 提供此功能。这两个库之间的依赖项解析逻辑是相同的,并且通常应将它们设置为匹配,不过您也可以显式地将它们设置为不同的逻辑。

例如,要将 AWS-LC 用作 libcrypto 库,可按如下方式进行构建:

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 .

第 2 步:从源代码构建 curl 或使用与您的 libcrypto 库兼容的 curl 发行版。

适用于 C++ 的 SDK 要求在将要用于发出 HTTP 请求的系统上安装一个 HTTP 客户端。HTTP 客户端必须用您打算使用的 libcrypto 构建。HTTP 客户端负责 TLS 操作,因此使用您的 libcrypto 库。

在以下示例中,使用 AWS-LC 的已安装版本重新构建 curl 库。

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

步骤 3:使用 libcrypto 和 curl 库构建 SDK

现在可以使用之前创建的 libcrypto 和 curl 构件来构建适用于 C++ 的 SDK。此版本的 SDK 将使用自定义 libcrypto 库来实现所有加密功能。

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 .

将所有内容整合到 Docker 映像中

以下 Docker 示例文件展示了如何在 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 .