

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 中使用自訂 libcrypto 程式庫 適用於 C\$1\$1 的 AWS SDK
<a name="libcrypto"></a>

 根據預設， 適用於 C\$1\$1 的 AWS SDK 會使用預設的系統密碼編譯程式庫來確保傳輸層的安全性。不過，適用於 C\$1\$1 的 SDK 可以選擇性地設定為在從來源建置 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 標準。

## 如何在適用於 C\$1\$1 的 SDK 中建置自訂 libcrypto
<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 取決於請求是否使用 SDK `CRT S3`的功能，這取決於兩個不同的 HTTP 用戶端。CRT 具體取決於 [s2n](https://github.com/aws/s2n-tls)，這是在啟動時初始化的 TLS 實作。軟體開發套件和 s2n 團隊都有 cmake 參數，可強制使用共用的 libcrypto 程式庫，無論 的值為何[BUILD\$1SHARED\$1LIBS](cmake-params.md#cmake-build-shared-libs)。一般而言，您希望 CRT HTTP 用戶端和一般 HTTP 用戶端使用相同的 libcrypto。在這種情況下，這表示在相依性樹狀目錄中參考 OpenSSL。開發套件透過 提供此項目[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 程式庫。

 在下列範例中，curl 程式庫是使用已安裝的 版本重建`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
```

### 步驟 3：使用 libcrypto 和 curl 程式庫建置 SDK
<a name="BuildUsingLibcryptoCurl"></a>

適用於 C\$1\$1 的 SDK 現在可使用先前建立的 libcrypto 和 curl 成品來建置。此 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 .
```