在将密钥导入 Cloud KMS 之前,必须先使用 PKCS#11
CKM_RSA_AES_KEY_WRAP
方案封装密钥,该方案同时包含 RSA-OAEP
(默认情况下包含在 OpenSSL 1.1 中)和使用填充的 AES 密钥封装(不包含在 OpenSSL 1.1 中)。该机制未包含在 OpenSSL 中。
我们建议您在导入期间使用 Google Cloud CLI 自动封装每个密钥。如果由于合规或监管要求而必须手动封装密钥,则必须先重新编译 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 安装位置。
从 https://www.openssl.org/source 下载 OpenSSL 1.1.0l 版本的源代码。这是 1.1.0 代码行中的最新版本。请勿在此过程中使用较新版本的 OpenSSL,例如版本 1.1.1。补丁程序将无法应用。
使用以下命令将归档解压缩到
${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
使用以下命令对提取的 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 @@ -482,6 +482,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
运行以下命令,从修补后的源代码构建 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 安装。运行以下命令以检查新的 OpenSSL 二进制文件是否已成功安装:
test -x ${HOME}/local/bin/openssl || echo FAIL
如果二进制文件已正确安装,您应该不会看到任何输出。如果您看到
FAIL
,请检查之前运行的make
、make test
和make install
命令的输出。已修补的 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
使用以下命令,检查脚本启动的 OpenSSL 版本是否为您刚刚构建和安装的版本:
${HOME}/local/bin/openssl.sh version
您现在可以调用 ${HOME}/local/bin/openssl.sh
封装容器脚本来手动封装密钥以进行导入。