Desplegar Aplicaciones ADF Essentials en Glassfish Remoto

Configuraciones adicionales a Glassfish cuando éste se encuentra en un servidor remoto

Tal como vimos en Glassfish para ADF Essentials, es posible desplegar nuestras aplicaciones desarrolladas con Oracle ADF Essentials en un servidor Glassfish con solo algunas configuraciones adicionales. Sin embargo, cuando el servidor Glassfish no se encuentra en nuestra máquina local, sino en algún otro servidor, se requieren algunas configuraciones adicionales.

Hoy hablaremos de las configuraciones que se deben hacer al servidor Glassfish remoto para poder desplegar aplicaciones desarrolladas con ADF Essentials desde JDeveloper. Específicamente nos referiremos a la versión ADF 12c (12.2.1), que al día de hoy es la versión más reciente, y, de acuerdo a la matriz de certificación para ADF 12c (12.2.1), al servidor Glassfish 4.1.x

Es importante anotar, que se presentarán las configuraciones mínimas para poder desplegar las aplicaciones en ambientes de desarrollo y pruebas remotos. Sin embargo, para ambientes productivos son necesarias configuraciones adicionales, sobretodo respecto a seguridad.

¿Qué se requiere?
Seguir los mismos pasos de instalación de las librerías de ADF Essentials (adf-essentials, javax.faces, javax.el, antlr-runtime) encontrados en Glassfish para ADF Essentials, pero obviamente en el servidor remoto. Dado que el servidor es remoto, no será posible acceder a la consola de administración sin configurar su seguridad primero, así que la configuración de opciones de la JVM de Glassfish la realizaremos después.

Una vez hemos instalado Glassfish y las librerías de ADF Essentials, debemos habilitar la administración remota para que podamos acceder a la consola de administración. Para ello, debemos cambiar la clave por defecto (la cual es vacía) y ejecutar el comando que habilita la administración segura. Debemos ejecutar los siguientes comandos en el servidor remoto (a través de ssh o escritorio remoto), los cuales, dependiendo del lugar de instalación de Glassfish, pueden requerir acceso de superusuario.

Primero iniciamos Glassfish:

{GLASSFISH_HOME}/bin/asadmin start-domain domain1

Ahora cambiamos la clave del usuario administrador:

{GLASSFISH_HOME}/bin/asadmin change-admin-password

El anterior comando realizará las siguientes preguntas:

Enter admin user name [default: admin]> [Dejar vacío]
Enter the admin password> [Dejar vacío]
Enter the new admin password> [Ingresa la nueva clave]
Enter the new admin password again> [Repite la nueva clave]

Una vez hemos cambiado la clave, debemos habilitar la administración segura:

{GLASSFISH_HOME}/bin/asadmin enable-secure-admin

Reiniciamos Glassfish:

{GLASSFISH_HOME}/bin/asadmin restart-domain domain1

Y podemos abrir la consola de administración de Glassfish ingresando a:

https://{SERVER_URL}:4848

Glassfish usa certificados autofirmados para establecer la conexión segura y los navegadores mostrarán su descontento cuando intentemos acceder a la anterior URL. Sin embargo, adicionando una excepción al navegador podremos acceder a la consola y terminar de realizar las configuraciones de parámetros tal y como lo hicimos en en Glassfish para ADF Essentials. Sigue los pasos allí encontrados a partir de la configuración de la JVM de Glassfish:

glassfish-jvm-props-nav

Una vez terminamos las configuraciones de parámetros de la JVM de Glassfish, podemos configurar el servidor en JDeveloper e intentar desplegar la aplicación en nuestro Glassfish remoto.

Adicionemos nuestro servidor remoto en el panel de servidores de aplicaciones. Si no tienes abierto dicho panel, puedes encontrarlo en el menú: Window>Application Severs. Una vez ubicados en el panel, con clic derecho abrimos el menú contextual y seleccionamos la opción New Application Server:

jdev-app-server-panel

En la siguiente pantalla seleccionamos la opción Standalone Server:

jdev-add-server-step1

Definimos que el servidor es Glassfish y le asignamos un nombre con el cual lo podremos identificar en el panel de servidores de aplicaciones:

jdev-add-server-step2

Ingresamos los datos de autenticación tal y como los definimos más arriba:

jdev-add-server-step3

Configuramos la ubicación y puertos de escucha del servidor. Notar que se debe marcar la casilla Secure Admin Enabled, debido a que en pasos previos activamos la administración segura:

jdev-add-server-step4

Procedemos a probar la conexión con el servidor Glassfish remoto y nos encontramos con los siguientes errores:

jdev-add-server-step5-test-errors

Debido a que Glassfish usa certificados autofirmados para establecer la conexión segura, es muy posible que dichos certificados no coincidan con las configuraciones del host remoto y debamos realizar algunas configuraciones adicionales.

Lo que vamos a hacer es crear certificados nuevos, también autofirmados, pero que coincidan con el nombre del host en el que está instalado Glassfish y reemplazaremos los certificados que usa Glassfish por los que acabamos de crear. Por último instalaremos el certificado recién creado en la máquina donde está instalado JDeveloper para que éste pueda conectarse seguramente a Glassfish, usando su mismo certificado.

Debemos ejecutar los siguientes comandos en el servidor remoto (a través de ssh o escritorio remoto), los cuales, dependiendo del lugar de instalación de Glassfish, pueden requerir acceso de superusuario.

Primero detenemos Glassfish:

{GLASSFISH_HOME}/bin/asadmin stop-domain domain1

Nos ubicamos en la siguiente carpeta, que es donde Glassfish tiene su almacén de llaves de seguridad:

cd {GLASSFISH_HOME}/glassfish/domains/domain1/config/

Eliminamos los certificados por defecto de Glassfish (s1as y glassfish-instance), la clave por defecto del almacén de llaves es “changeit”:

keytool -delete -alias s1as -keystore keystore.jks -storepass changeit
keytool -delete -alias glassfish-instance -keystore keystore.jks -storepass changeit
keytool -delete -alias s1as -keystore cacerts.jks -storepass changeit
keytool -delete -alias glassfish-instance -keystore cacerts.jks -storepass changeit

Creamos nuestros propios certificados, asegurándonos de modificar los valores para NombreServidor (debe coincidir obligatoriamente con el nombre del servidor), MiGrupoOrganizacional (ejemplo Desarrollo), MiEmpresa (ejemplo Empresa SA), MiCiudad (ejemplo Cali), MiEstado (ejemplo Valle) y MiPais (ejemplo CO):

keytool -keysize 2048 -genkey -alias s1as -keyalg RSA -dname "CN=NombreServidor,OU=MiGrupoOrganizacional,O=MiEmpresa,L=MiCiudad,ST=MiEstado,C=MiPais" -validity 3650 -storepass changeit -keystore keystore.jks
keytool -keysize 2048 -genkey -alias glassfish-instance -keyalg RSA -dname "CN=NombreServidor,OU=MiGrupoOrganizacional,O=MiEmpresa,L=MiCiudad,ST=MiEstado,C=MiPais" -validity 3650 -storepass changeit -keystore keystore.jks

Una vez creados, debemos exportarlos para luego importarlos en el otro almacén y en la máquina de desarrollo. Los siguientes comandos exportan los certificados recién creados y los ubican en el directorio temporal:

keytool -export -alias s1as -file /tmp/s1as.cert -keystore keystore.jks -storepass changeit
keytool -export -alias glassfish-instance -file /tmp/glassfish-instance.cert -keystore keystore.jks -storepass changeit

Los importamos al otro almacén:

keytool -import -alias s1as -file /tmp/s1as.cert -keystore cacerts.jks -storepass changeit
keytool -import -alias glassfish-instance -file /tmp/glassfish-instance.cert -keystore cacerts.jks -storepass changeit

Y por último, reconfiguramos Glassfish para que use los nuevos certificados:

{GLASSFISH_HOME}/bin/asadmin start-domain domain1
{GLASSFISH_HOME}/bin/asadmin enable-secure-admin --adminalias=s1as --instancealias=glassfish-instance

En la máquina donde está instalado JDeveloper, debemos importar el certificado s1as.cert, para ello debemos descargar el archivo que exportamos al directorio temporal y ejecutar el siguiente comando en la máquina de desarrollo (es posible que se requieran permisos de superusuario):

keytool -import -alias glassfish-remoto -file s1as.cert -keystore {JAVA_HOME}/jre/lib/security/cacerts -storepass changeit

Una vez terminamos estas configuraciones y probamos nuevamente la conexión con el servidor de aplicaciones desde JDeveloper, deberíamos obtener lo siguiente:

jdev-add-server-step5-test-ok

Esto es suficiente para que podamos desplegar nuestras aplicaciones ADF Essentials a un servidor Glassfish remoto desde JDeveloper.

Opcional
Nótese que hemos recibido el error Testing JSR 160 (failed) y si deseamos que todas las pruebas pasen exitosamente, debemos configurar parámetros adicionales a la JVM de Glassfish, ya sea usando los siguientes comandos (es posible que se requieran permisos de superusuario):

asadmin create-jvm-options '-Djava.rmi.server.hostname=NombreServidor'
asadmin create-jvm-options '-Dcom.sun.management.jmxremote=true'
asadmin create-jvm-options '-Dcom.sun.management.jmxremote.port=8686'
asadmin create-jvm-options '-Dcom.sun.management.jmxremote.ssl=false'
asadmin create-jvm-options '-Dcom.sun.management.jmxremote.authenticate=false'

O directamente en la consola de administración, adicionando los anteriores parámetros a la configuración de la JVM de Glassfish:

glassfish-jvm-props-nav

Una vez terminamos la anterior configuración, obtendríamos el siguiente resultado de la prueba de conexión:

jdev-add-server-step5-test-all-ok