Configurar OpenSSL para la unión manual de la clave

Antes de importar una clave a Cloud KMS, debes unirla con el esquema PKCS#11 CKM_RSA_AES_KEY_WRAP, que incluye RSA-OAEP (que se incluye en OpenSSL 1.1 de forma predeterminada) y la unión de claves AES con relleno (que no se incluye). Ese mecanismo no está incluido en OpenSSL.

Recomendamos usar la herramienta de línea de comandos de gcloud para unir cada clave de forma automática durante la importación. Si debes unir tus claves de forma manual debido a requisitos normativos o de cumplimiento, primero debes volver a compilar OpenSSL para agregar compatibilidad con la unión de claves AES con relleno. Después de volver a compilar OpenSSL, puedes unir la clave de forma manual.

Antes de comenzar

Sigue los procedimientos de este tema para no reemplazar los archivos binarios OpenSSL incorporados del sistema por los archivos binarios con aplicación de parches producidos. Por ejemplo, no instales el OpenSSL con parches directamente en /usr. Si sigues este procedimiento con exactitud, el OpenSSL con parches 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 otro lugar antes de seguir los pasos de este tema.

Aplica parches e instala OpenSSL v1.1.0

Si eliges usar OpenSSL para unir manualmente tus claves antes de importarlas a Cloud KMS, se requiere OpenSSL v1.1.0, con el siguiente parche aplicado. Deberás compilar OpenSSL y, luego, instalarlo en una ubicación independiente de la instalación predeterminada de OpenSSL en tu sistema.

  1. Descarga la fuente para la versión 1.1.0l de OpenSSL desde https://www.openssl.org/source. Esta es la versión más reciente en la línea de código 1.1.0. No uses una versión más reciente de OpenSSL, como v1.1.1, en este procedimiento. La aplicación del parche fallará.

  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. Reemplaza /path/to/downloaded-openssl.tar.gz por la ruta de acceso 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 a la fuente de OpenSSL extraída 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
    @@ -533,6 +533,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 objetos binarios y las bibliotecas de OpenSSL desde la fuente con el parche, prueba la compilación de la compilación y, luego, instala los objetos 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 no reemplazar la instalación de OpenSSL del sistema.

  5. Ejecuta el siguiente comando para verificar que el objeto binario de OpenSSL nuevo se haya instalado de forma correcta:

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

    No deberías ver ningún resultado si los objetos binarios están instalados de forma correcta. Si ves FAIL, verifica el resultado de los comandos make, make test y make install que ejecutaste antes.

  6. Los objetos binarios de OpenSSL con parches se vinculan de forma dinámica con las bibliotecas de OpenSSL en ${HOME}/local/ssl/lib/, pero el comando ld no indexa estas bibliotecas de forma predeterminada. Ejecuta los siguientes comandos a fin de crear una secuencia de comandos de wrapper que agregue las bibliotecas con parches a ${LD_LIBRARY_PATH} antes de invocar la CLI para el OpenSSL con parches.

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

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

Ahora puedes invocar la secuencia de comandos de wrapper ${HOME}/local/bin/openssl.sh para vincular manualmente las claves para la importación.