Configurar o OpenSSL para a união manual de chaves

Antes de poder importar uma chave para o Cloud KMS, tem de a encapsular com o esquema PKCS#11 CKM_RSA_AES_KEY_WRAP, que inclui RSA-OAEP (incluído no OpenSSL 1.1 por predefinição) e o encapsulamento de chaves AES com preenchimento (que não está incluído). Esse mecanismo não está incluído no OpenSSL.

Recomendamos que use a CLI do Google Cloud para encapsular cada chave automaticamente durante a importação. Se tiver de encapsular as chaves manualmente devido a requisitos de conformidade ou regulamentares, tem de recompilar primeiro o OpenSSL para adicionar suporte para o encapsulamento de chaves AES com preenchimento. Depois de recompilar o OpenSSL, pode encapsular a chave manualmente.

Antes de começar

Não substitua os binários OpenSSL incorporados do seu sistema pelos binários corrigidos produzidos seguindo os procedimentos neste tópico. Por exemplo, não instale o OpenSSL corrigido diretamente em /usr. Se seguir este procedimento exatamente, o OpenSSL corrigido é incorporado em $HOME/build e instalado em $HOME/local/bin.

Se a pasta ${HOME}/local/bin já existir, faça uma cópia de segurança do respetivo conteúdo ou mova esses ficheiros para outro local antes de seguir os passos neste tópico.

Aplique patches e instale o OpenSSL v1.1.0

Se optar por usar o OpenSSL para encapsular manualmente as suas chaves antes de as importar para o Cloud KMS, é necessária a versão 1.1.0 do OpenSSL com o seguinte patch aplicado. Tem de compilar o OpenSSL e instalá-lo numa localização separada da instalação predefinida do OpenSSL do seu sistema.

  1. Transfira a origem da versão 1.1.0l do OpenSSL a partir de https://www.openssl.org/source. Esta é a versão mais recente na linha de código 1.1.0. Não use uma versão mais recente do OpenSSL, como a v1.1.1, neste procedimento. A correção não vai ser aplicada.

  2. Extraia o arquivo para ${HOME}/build/openssl/ através do seguinte comando. Este comando substitui o diretório predefinido, que inclui a versão do OpenSSL e é alterado com frequência. Substitua /path/to/downloaded-openssl.tar.gz pelo caminho para o arquivo .tar.gz transferido.

    # 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. Aplique uma correção personalizada à origem do OpenSSL extraída através dos seguintes comandos.A correção ativa a flag 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. Execute os seguintes comandos para criar os binários e as bibliotecas do OpenSSL a partir da origem corrigida, testar a validade da compilação e instalar os binários e as bibliotecas no diretório ${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
    

    Não omita nem modifique as flags --prefix ou --openssldir para garantir que não substitui a instalação do OpenSSL do sistema.

  5. Execute o seguinte comando para verificar se o novo ficheiro binário OpenSSL foi instalado com êxito:

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

    Não deve ver qualquer resultado se os ficheiros binários estiverem instalados corretamente. Se vir FAIL, verifique a saída dos comandos make, make test e make install que executou anteriormente.

  6. Os binários do OpenSSL corrigidos estão dinamicamente associados às bibliotecas do OpenSSL em ${HOME}/local/ssl/lib/, mas o comando ld não indexa estas bibliotecas por predefinição. Execute os seguintes comandos para criar um script de wrapper que adiciona as bibliotecas corrigidas ao ${LD_LIBRARY_PATH} antes de invocar a CLI para o OpenSSL corrigido.

    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. Verifique se a versão do OpenSSL iniciada pelo script é a versão que acabou de criar e instalar através do seguinte comando:

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

Agora, pode invocar o script de contentor ${HOME}/local/bin/openssl.sh para criar manualmente um contentor de chaves para importação.