Configurar OpenSSL para encapsular claves manualmente

Antes de importar una clave en Cloud KMS, debe encapsularse con el esquema PKCS#11 CKM_RSA_AES_KEY_WRAP, que incluye tanto RSA-OAEP (que se incluye en OpenSSL 1.1 de forma predeterminada) como AES Key Wrap with Padding (que no se incluye). Ese mecanismo no está incluido en OpenSSL.

Te recomendamos que uses la CLI de Google Cloud para envolver cada clave automáticamente durante la importación. Si debes encapsular tus claves manualmente debido a requisitos de cumplimiento o normativos, primero debes volver a compilar OpenSSL para añadir compatibilidad con el encapsulado de claves AES con relleno. Después de volver a compilar OpenSSL, puedes encapsular la clave manualmente.

Antes de empezar

No sobrescribas los archivos binarios de OpenSSL integrados en tu sistema con los archivos binarios parcheados que se producen siguiendo los procedimientos de este tema. Por ejemplo, no instales la versión parcheada de OpenSSL directamente en /usr. Si sigues este procedimiento al pie de la letra, el OpenSSL parcheado se compilará en $HOME/build y se instalará en $HOME/local/bin.

Si ${HOME}/local/bin ya existe, crea una copia de seguridad de su contenido o mueve esos archivos a otra ubicación antes de seguir los pasos de este tema.

Parchea e instala OpenSSL v1.1.0

Si decides usar OpenSSL para encapsular manualmente tus claves antes de importarlas a Cloud KMS, debes usar OpenSSL 1.1.0 con el siguiente parche aplicado. Deberás compilar OpenSSL e instalarlo en una ubicación distinta de la instalación predeterminada de OpenSSL de tu sistema.

  1. Descarga el código fuente de la versión 1.1.0l de OpenSSL desde https://www.openssl.org/source. Esta es la última versión de la línea de código 1.1.0. No utilices una versión más reciente de OpenSSL, como la 1.1.1, en este procedimiento. No se podrá aplicar el parche.

  2. Extrae el archivo en ${HOME}/build/openssl/ con el siguiente comando. Este comando anula el directorio predeterminado, que incluye la versión de OpenSSL y cambia con frecuencia. Sustituye /path/to/downloaded-openssl.tar.gz por la ruta al archivo .tar.gz descargado.

    # 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. Aplica un parche personalizado al origen de OpenSSL extraído con los siguientes comandos.El parche habilita la marca 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. Ejecuta los siguientes comandos para compilar los archivos binarios y las bibliotecas de OpenSSL a partir de la fuente parcheada, prueba la validez de la compilación e instala los archivos binarios y las bibliotecas en el directorio ${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
    

    No omita ni modifique las marcas --prefix o --openssldir para asegurarse de que no sobrescribe la instalación de OpenSSL del sistema.

  5. Ejecuta el siguiente comando para comprobar que el nuevo archivo binario de OpenSSL se ha instalado correctamente:

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

    Si los archivos binarios se han instalado correctamente, no deberías ver ningún resultado. Si ves FAIL, comprueba el resultado de los comandos make, make test y make install que has ejecutado antes.

  6. Los binarios de OpenSSL parcheados están vinculados dinámicamente a las bibliotecas de OpenSSL en ${HOME}/local/ssl/lib/, pero el comando ld no indexa estas bibliotecas de forma predeterminada. Ejecuta los siguientes comandos para crear una secuencia de comandos envolvente que añada las bibliotecas parcheadas a ${LD_LIBRARY_PATH} antes de invocar la CLI de OpenSSL parcheada.

    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. Comprueba que la versión de OpenSSL que inicia la secuencia de comandos es la que acabas de compilar e instalar con el siguiente comando:

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

Ahora puedes invocar la secuencia de comandos del wrapper ${HOME}/local/bin/openssl.sh para envolver manualmente las claves para importarlas.