配置 OpenSSL 以进行手动密钥封装

在将密钥导入 Cloud KMS 之前,必须先使用 PKCS#11 CKM_RSA_AES_KEY_WRAP 方案封装密钥,该方案同时包含 RSA-OAEP(默认情况下包含在 OpenSSL 1.1 中)和使用填充的 AES 密钥封装(不包含在 OpenSSL 1.1 中)。该机制未包含在 OpenSSL 中。

我们建议您使用 gcloud 命令行工具在导入期间自动封装每个密钥。如果由于合规或监管要求而必须手动封装密钥,则必须先重新编译 OpenSSL 以添加对“使用填充的 AES 密钥封装”的支持。重新编译 OpenSSL 后,您可以手动封装密钥

准备工作

请勿使用按照本主题中的步骤生成的经过修补的二进制文件覆盖系统内置的 OpenSSL 二进制文件。例如,请勿将修补后的 OpenSSL 直接安装到 /usr。如果您完全按照此过程操作,则经过修补的 OpenSSL 将内置在 $HOME/build 中并安装到 $HOME/local/bin 中。

如果 ${HOME}/local/bin 已存在,请备份其内容或将这些文件移至其他位置,然后按照本主题中的步骤操作。

修补并安装 OpenSSL 版本 1.1.0

如果您选择在将密钥导入 Cloud KMS 之前使用 OpenSSL 手动封装密钥,则必须使用 OpenSSL 版本 1.1.0,并应用以下补丁程序。您需要编译 OpenSSL 并将其安装到不同于系统的默认 OpenSSL 安装位置。

  1. https://www.openssl.org/source 下载 OpenSSL 1.1.0l 版本的源代码。这是 1.1.0 代码行中的最新版本。请勿在此过程中使用较新版本的 OpenSSL,例如版本 1.1.1。补丁程序将无法应用。

  2. 使用以下命令将归档解压缩到 ${HOME}/build/openssl/。此命令会覆盖默认目录,该目录包含 OpenSSL 的版本并经常更改。将 /path/to/downloaded-openssl.tar.gz 替换为下载的 .tar.gz 归档的路径。

    # Create the directory for the eventual OpenSSL binaries
    mkdir -p ${HOME}/local/ssl
    
    # Create the build directory
    mkdir -p ${HOME}/build/openssl
    
    # Extract the archive to ${HOME}/build/openssl
    tar xzvf /path/to/downloaded-openssl.tar.gz \
      -C ${HOME}/build/openssl/ \
      --strip-components 1
    
  3. 使用以下命令对提取的 OpenSSL 源代码应用自定义补丁程序。该补丁程序会启用 EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 标志。

    cd ${HOME}/build
    cat <<-EOF | patch -d . -p0
    --- orig/openssl/apps/enc.c 2020-01-17 14:39:54.991708785 -0500
    +++ openssl/apps/enc.c  2020-01-17 14:41:33.215704269 -0500
    @@ -533,6 +533,7 @@
              */
    
             BIO_get_cipher_ctx(benc, &ctx);
    +   EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
    
             if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) {
                 BIO_printf(bio_err, "Error setting cipher %s\n",
    EOF
    

  4. 运行以下命令,从修补后的源代码构建 OpenSSL 二进制文件和库、测试构建文件的有效性,并将二进制文件和库安装到 ${HOME}/local 目录中。

    CPUS=$(getconf _NPROCESSORS_ONLN)
    cd ${HOME}/build/openssl
    ./config --prefix=${HOME}/local --openssldir=${HOME}/local/ssl
    make -j${CPUS}
    make test
    make install
    

    请勿省略或修改 --prefix--openssldir 标志,以确保您不会覆盖系统的 OpenSSL 安装。

  5. 运行以下命令以检查新的 OpenSSL 二进制文件是否已成功安装:

    test -x ${HOME}/local/bin/openssl || echo FAIL
    

    如果二进制文件已正确安装,您应该不会看到任何输出。如果您看到 FAIL,请检查之前运行的 makemake testmake install 命令的输出。

  6. 已修补的 OpenSSL 二进制文件会动态链接到 ${HOME}/local/ssl/lib/ 中的 OpenSSL 库,但默认情况下,ld 命令不会将这些库编入索引。运行以下命令以创建封装容器脚本,该脚本将已修补的库添加到 ${LD_LIBRARY_PATH},然后为已修补的 OpenSSL 调用 CLI。

    cat > ${HOME}/local/bin/openssl.sh <<-EOF
    #!/bin/bash
    env LD_LIBRARY_PATH=${HOME}/local/lib/ ${HOME}/local/bin/openssl "\$@"
    EOF
    chmod u+x ${HOME}/local/bin/openssl.sh
    

  7. 使用以下命令,检查脚本启动的 OpenSSL 版本是否为您刚刚构建和安装的版本:

    ${HOME}/local/bin/openssl.sh version
    

您现在可以调用 ${HOME}/local/bin/openssl.sh 封装容器脚本来手动封装密钥以进行导入