viernes, 22 de marzo de 2019

Habilitar SSL en Oracle HTTP Servrer 12c - Oracle Wallet


    Muchos productos Oracle, usan un componente fundamental para la comunicación con los clientes que acceden al mismo a través de un navegador web. Este componente, Oracle HTTP Server (mas conocido como OHS), es una versión modificada del ya conocido Apache HTTP Server, donde Oracle modifica el mismo añadiendo nuevas funcionalidades y modificando algunas características. Por ende, se aclara que al tratarse de una versión modificada de Apache, algunas directivas como SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile, entre otras. NO están disponibles, ya que por ejemplo el modulo ssl_mod de Apache, Oracle lo renombra a ossl_mod sacando dichas directivas del modulo imposibilitando su uso e incluyendo nuevas directivas como SSLWallet, SSLWalletPassword, etc.



    Debido a los cambios previamente mencionados, para usar certificados SSL y habilitar TLS en productos Oracle, de ahora en adelante será necesario hacer uso de Wallets claro está.


Pasos a seguir

1) - Crear wallet protegida con contraseña usando OpenSSL.

    La utilidad para administrar wallets via CLI (Command Line Interface... es decir, por consola) ORAPKI de Oracle se usará para abordar la creación del wallet y la importación de certificados mas adelante.

    Debido a ciertas restricciones en la herramienta, no es posible importar privateKeys desde la misma por ello en su lugar se hará parte del proceso con OpenSSL a modo de workaround.

    Para crear un wallet con contraseña que contenga tanto el certificado del servidor como la privateKey, se necesita contar con los siguientes archivos:
  • Certificado del servidor: server_ip_testing.crt
  • Llave privada: server_ip_testing.key
  • Certificado Raiz de la Entidad Certificante (Root CA): Verisign_CA.cer

Aclaración: normalmente, se cuenta con un certificado del servidor como la privateKey adjunta en un mismo archivo bundle con formato PEM. Al ser texto plano generalmente, con herramientas de edición de texto como VIM o Nano, se puede separar en archivos independientes, lo cual es mas conveniente para abordar las tareas del presente articulo.


    Para poder crear el wallet, ejecutar el siguiente comando:
$ openssl pkcs12 -export -in /path/to/server_ip_test.crt -inkey /path/to/server_ip_test.key -certfile /path/to/Verisign_CA.cer -out /tmp/ewallet.p12

NOTA: el comando anterior pedirá 2 contraseñas, una perteneciente a la pirvateKey y otra que tendremos que repetir para validar perteneciente al wallet en sí.




2) - Crear directorio donde se alojará el wallet

    Los wallet deben almacenarse en algún directorio de nuestra preferencia que nos resulte cómodo luego encontrarlos. Para este caso, la buena practica es alojarlo dentro de la instancia del producto, carpeta secutiry --> subcarpeta wallet, procedemos a crear dicha carpeta ejecutando el siguiente comando:
$ mkdir -p $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet




3) - Acomodar wallet anteriormente creada

    Para que todo resulte según lo esperado, debemos posicionar el wallet creado en el paso ( 1 ) dentro del directorio creado en el paso ( 2 ). Para ello, basta con copiar el wallet ejecutando el siguiente comando:
$ cp /tmp/ewallet.p12 $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet




4) - Validar contenido del wallet

    Para cerciorarse de que el wallet ya posee el USER_CERTIFICATE (certificado que usaran los clientes a la hora de conectarse mediante navegador web al producto), importada en el paso ( 1 ) y ver que se necesitan los certificados intermedios de la cadena, se puede visualizar el contenido de la misma ejecutando los siguientes comandos:
$ cd $ORACLE_HOME/oracle_common/bin/

$ ./orapki wallet display -wallet $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet/ewallet.p12 -pwd <wallet_password>




5) - Añadir certificados intermedios de la cadena

    Necesitamos contar con la cadena completa de certificados, para ello necesitamos todos los certificados intermedios de la cadena en archivos separados. Copiarlos a una carpeta cómoda de acceder dentro del servidor y ejecutar los siguientes comandos:
$ ./orapki wallet add -wallet $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet/ewallet.p12 -cert /path/to/intermediate_cert_1.cer -trusted_cert -pwd <wallet_password>

$ ./orapki wallet add -wallet $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet/ewallet.p12 -cert /path/to/intermediate_cert_N.cer -trusted_cert -pwd <wallet_password>




6) - Convertir wallet protegido con contraseña en un wallet auto_login 

    Si usáramos la careta recién generada (en formato p12), cada acción que implique el uso del wallet nos pedirá ingresar la contraseña, ademas de que tendremos que plasmarla en un archivo de configuración de OHS quedando en texto plano, lo cual no es muy seguro. Para convertir el wallet en una con auto_login (sin necesidad de que requiera contraseña), ejecutar el siguiente comando:
./orapki wallet create -wallet $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet/ewallet.p12 -pwd <wallet_password> -auto_login


NOTA: en algunos casos en productos como Forms&Reports 12c, ORAPKI esta mas actualizado y el comando anterior podría fallar al ejecutarse a la hora de convertir el wallet p12 a un cwallet.sso con auto_login, o por algún motivo el cwallet.sso final queda con contraseña (lo cual no es lo esperado). Con los siguientes comando se solventa el inconveniente:

$ ./orapki wallet create -wallet $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet -auto_login_only -with_trust_flags -compat_v12

$ ./orapki wallet import_pkcs12 -wallet $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet -pkcs12file $ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet/ewallet.p12 -auto_login_only

El comando anterior puede requerir la contraseña del ewallet.p12.




7) - Configurar OHS para habilitar TLS y que use la cartera ya convertida

    Es necesario configurar OHS para habilitar TLS revisando los siguientes archivos:
  • $ORACLE_HOME/user_projects/domains/<domain_name>/config/fmwconfig/components/OHS/instances/<OHSinstance_name>/ssl.conf
  • $ORACLE_HOME/user_projects/domains/<domain_name>/config/fmwconfig/components/OHS/<OHSinstance_name>/ssl.conf

    Verificar que ambos archivos tengan las siguiente directivas configuradas dentro del Virtual Host:

SSLEngine on
SSLProtocol -All +TLSv1.2 +TLSv1
SSLWallet "$ORACLE_HOME/user_projects/domains/<domain_name>/security/wallet"





Cualquier duda o aclaración se puede debatir libremente en los comentarios del articulo con total respeto. 

No hay comentarios:

Publicar un comentario