Como configurar o OpenSSL para encapsulamento manual de chaves

Antes de importar uma chave para o Cloud KMS, ela precisa ser encapsulada usando o esquema PKCS#11 (em inglês) CKM_RSA_AES_KEY_WRAP, que inclui RSA-OAEP (incluído no OpenSSL 1.1 por padrão) e encapsulamento de chaves AES com preenchimento (que não é incluído). Esse mecanismo não está incluído no OpenSSL.

Recomendamos o uso da Google Cloud CLI para encapsular cada chave automaticamente durante a importação. Se você precisar encapsular as chaves manualmente devido a requisitos regulatórios ou de conformidade, primeiro recompile o OpenSSL para adicionar compatibilidade com encapsulamento de chaves AES com preenchimento. Depois de recompilar o OpenSSL, é possível encapsular a chave manualmente.

Antes de começar

Não substitua os binários OpenSSL integrados do sistema pelos binários com patch produzidos seguindo os procedimentos deste tópico. Por exemplo, não instale o OpenSSL com patch diretamente em /usr. Se você seguir exatamente esse procedimento, o OpenSSL com patch será criado em $HOME/build e instalado em $HOME/local/bin.

Se o ${HOME}/local/bin já existir, faça backup do conteúdo dele ou mova esses arquivos para outro lugar antes de seguir as etapas deste tópico.

Corrigir e instalar o OpenSSL v1.1.0

Se você optar por usar o OpenSSL para ajustar manualmente suas chaves antes de importá-las para o Cloud KMS, o OpenSSL v1.1.0 será necessário, com a seguinte correção aplicada. Você precisará compilar o OpenSSL e instalá-lo em um local separado da instalação padrão do seu sistema OpenSSL.

  1. Faça o download do código-fonte para a versão do OpenSSL 1.1.0l em 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. O patch não será aplicado.

  2. Extraia o arquivo para ${HOME}/build/openssl/ usando o comando a seguir. Esse comando substitui o diretório padrão, que inclui a versão do OpenSSL e muda com frequência. Substitua /path/to/downloaded-openssl.tar.gz pelo caminho do arquivo .tar.gz salvo.

    # 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 um patch personalizado à origem do OpenSSL extraída usando os comandos a seguir. O patch ativa a sinalização 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 construir binários e bibliotecas OpenSSL a partir da origem com patch, teste a validade da build e instale 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 ou modifique os sinalizadores --prefix ou --openssldir, para garantir que você não substitua a instalação do OpenSSL do sistema.

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

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

    Você não verá saída se os binários estiverem instalados corretamente. Caso veja FAIL, verifique a saída dos comandos make, make test e make install executados anteriormente.

  6. Os binários do OpenSSL corrigidos são vinculados dinamicamente às bibliotecas do OpenSSL em ${HOME}/local/ssl/lib/, mas o comando ld não indexa essas bibliotecas por padrão. Execute os seguintes comandos para criar um script de encapsulamento que adicione as bibliotecas com patch ao ${LD_LIBRARY_PATH} antes de invocar a CLI para o OpenSSL com patch.

    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 que o script inicia é a versão que você acabou de criar e instalar usando o seguinte comando:

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

Agora você pode invocar o script de encapsulamento ${HOME}/local/bin/openssl.sh para encapsular manualmente as chaves para importação.