

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

# 在中使用自定义 libcrypto 库 适用于 C\$1\$1 的 AWS SDK
<a name="libcrypto"></a>

 默认情况下， 适用于 C\$1\$1 的 AWS SDK 使用默认的系统加密库来保护传输层安全。但是，从源代码构建 SDK 时，可以选择将适用于 C\$1\$1 的 SDK 配置为使用不同的 libcrypto 库。从功能上讲，这意味着所有加密操作都将转由 OpenSSL 的自定义实现来处理。例如，您可能想在 [FIPS 模式](https://aws.amazon.com/blogs/security/aws-lc-is-now-fips-140-3-certified/)下使用 [https://github.com/aws/aws-lc](https://github.com/aws/aws-lc) 库，以便在应用程序中实现 FIPS 标准。

## 如何将自定义 libcrypto 集成到适用于 C\$1\$1 的 SDK 中
<a name="howToBuildLibcrypto"></a>

### 第 1 步：构建或获取 libcrypto 库
<a name="buildObtainLibCrypto"></a>

[https://github.com/aws/aws-lc](https://github.com/aws/aws-lc) 是替代 libcrypto 库的一个示例，但任何 OpenSSL 发行版或与 OpenSSL 兼容的库均可使用。

适用于 C\$1\$1 的 SDK 及其依赖项 CRT 均使用 libcrypto 来实现加密功能，且两者需要以相同的方式处理依赖项。适用于 C\$1\$1 的 SDK 依赖于两个不同的 HTTP 客户端，具体取决于请求是否使用 SDK 的 `CRT S3` 功能。具体来说，CRT 依赖于 [s2n](https://github.com/aws/s2n-tls)，这是一种在启动时初始化的 TLS 实现。SDK 和 s2n 团队均提供了一个 cmake 参数，该参数强制使用共享的 libcrypto 库，而不考虑 [BUILD\$1SHARED\$1LIBS](cmake-params.md#cmake-build-shared-libs) 的值。通常，您希望 CRT HTTP 客户端和常规 HTTP 客户端使用相同的 libcrypto。在这种情况下，这意味着两者都在依赖项树中引用 OpenSSL。SDK 通过 [AWS\$1USE\$1CRYPTO\$1SHARED\$1LIBS](cmake-params.md#cmake-use-crypto) 提供此功能，而 s2n（用于基于 CRT 的调用）通过 [https://github.com/aws/s2n-tls/blob/20010e6b75a09ab5a0fc69a86265d3cc4c103b91/CMakeLists.txt#L39](https://github.com/aws/s2n-tls/blob/20010e6b75a09ab5a0fc69a86265d3cc4c103b91/CMakeLists.txt#L39) 提供此功能。这两个库之间的依赖项解析逻辑是相同的，并且通常应将它们设置为匹配，不过您也可以显式地将它们设置为不同的逻辑。

例如，要将 `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 发行版。
<a name="BuildCurlWithLibCrypto"></a>

适用于 C\$1\$1 的 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
<a name="BuildUsingLibcryptoCurl"></a>

现在可以使用之前创建的 libcrypto 和 curl 构件来构建适用于 C\$1\$1 的 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 映像中
<a name="dockerImageForLibcrypto"></a>

以下 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 .
```