鍵の手動ラッピングを OpenSSL に構成する

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 v1.1.0 のパッチ適用とインストール

鍵を Cloud KMS にインポートする前に OpenSSL を使用して手動でラップする場合は、次のパッチが適用された OpenSSL v1.1.0 が必要です。OpenSSL をコンパイルして、システムのデフォルトの OpenSSL インストールとは別のロケーションにインストールする必要があります。

  1. https://www.openssl.org/source から OpenSSL 1.1.0l リリースのソースをダウンロードします。これは、1.1.0 コード行の最新リリースです。この手順では、v1.1.1 などの新しいバージョンの OpenSSL は使用しないでください。パッチの適用は失敗します。

  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
    @@ -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
    

  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
    

    システムの OpenSSL インストールを上書きしないように、--prefix フラグまたは --openssldir フラグを省略したり変更したりしないでください。

  5. 次のコマンドを実行して、新しい OpenSSL バイナリが正常にインストールされたことを確認します。

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

    バイナリが正しくインストールされている場合は何も出力されません。FAIL が表示された場合は、以前に実行した makemake testmake install コマンドの出力を確認します。

  6. パッチを適用した OpenSSL バイナリは、${HOME}/local/ssl/lib/ の OpenSSL ライブラリに対して動的にリンクされますが、ld コマンドはデフォルトではこれらのライブラリをインデックスに登録しません。次のコマンドを実行して、パッチを適用した OpenSSL の CLI を呼び出す前に、パッチを適用したライブラリを ${LD_LIBRARY_PATH} に追加します。

    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 ラッパー スクリプトから手動で鍵をラップしてインポートが起動できます。