viernes, 5 de enero de 2018

Configurar GMail como proveedor de correo para SOA Suite 12c


Sobre este tema, en internet ya hay muchos artículos bien elaborados. He pedido prestado al menos una docena para entender lo que debería suceder y para que funcione. Los encontrará listados al final del articulo en la sección recursos.

Todo comenzó cuando traté de que el Adaptador UMS envíe un correo electrónico. La configuración del driver de correo electrónico se realizó en la EM Console (ver a continuación) pero por desgracia WebLogic me arrojó un error bastante peculiar:




javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.s
ecurity.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)


El tema es que cuando configuré GMail como el servidor de correo saliente, configuré un servidor SMTP (smtp.gmail.com) que usa SSL para sus comunicaciones (de confianza). La JVM está perfectamente dispuesta a realizar tales comunicaciones por nosotros, siempre que sepa que realmente confiamos en la parte con la que estamos haciendo la comunicación SSL. Tenemos que decirle a la JVM que está bien tener tales comunicaciones. Y lo hacemos cargando la clave pública de un certificado SSL en el almacén de confianza de la JVM. Tenga en cuenta que exactamente lo mismo se requiere para las interacciones de SSL con otros proveedores, como Twitter y Dropbox, todos usando SSL también. Cuando queremos interactuar desde nuestro dominio SOA Suite con este tipo de cosas, también tenemos que seguir los pasos de este artículo.

 Los pasos que relizaremos son los siguientes: 
    • Recuperar el certificado SSL para smtp.gmail.com usando OpenSSL.
    • Crear un archivo de texto plano con solo el certificado SSL.
    • Cargar el certificado SSL en el almacén de claves de la JVM.
    • Reiniciar el dominio de WebLogic.


Manos a la obra!

Recuperar certificado SSL de GMail usando OpenSSL

 Usando la herramienta OpenSSL, podemos recuperar el certificado SSL del servidor con el que queremos que nuestra JVM interactúe más adelante. Para GMail, y más específicamente, el servidor SMTP de GMail para el correo electrónico saliente, usamos este comando para guardar su certificado SSL en un archivo llamado gmail-smtp-cert.pem. Puede elegir cualquier nombre para el archivo local, siempre que lo recuerde hasta el próximo paso. La extensión .pem se usa normalmente porque OpenSSL crea el archivo en el formato PEM.

En Linux, ya contamos con la herramienta OpenSSL pero en Windows no, los usuarios de Windows necesitarán descargar esta herramienta desde el siguiente link:


Para finalmente obtener el certificado SSL de GMail, correr el siguiente comando en una consola de simbolos del sistema (cmd):

openssl s_client -connect smtp.gmail.com:465 > gmail-smtp-cert.pem

El archivo gmail-smtp-cert.pem se debe crear ahora.

Nota: esta acción de OpenSSL puede llevar mucho tiempo o incluso no terminar. Puede finalizarlo después de algunos segundos (presionando la combinación de teclas CTRL + C) porque la parte importante se realiza muy rápido y al principio.



Crea un archivo de texto plano con solo el certificado

¡Este paso puede salir mal si no lee con cuidado!. Me llevó un tiempo considerable.

Abra el archivo que recuperó con OpenSSL (gmail-smtp-cert.pem en mi caso) en un editor de textos.




Elimine todas las líneas que estan antes de la línea que dice -----BEGIN CERTIFICATE----- ¡pero deje esta línea!. También elimine todas las líneas que están después de la línea que dice -----END CERTIFICATE----- pero nuevamente, ¡conserve esta línea!. Guarde el archivo resultante, por ejemplo, como gmail-smtp-certificate.txt (puede elegir el nombre que desee), el archivo debe quedar asi:



 

Cargar el certificado SSL en el almacén de claves de la JVM

WebLogic (en el que se ejecuta SOA Suite) en una instalación predeterminada utiliza un almacén de claves especial. No utiliza el almacén de cacerts que está instalado con JDK o JRE, sino que utiliza un archivo llamado DemoTrust.jks y, por lo general, se encuentra en %WL_HOME%\wlserver\server\lib\DemoTrust.jks. Este almacen de confianza se "inyecta" en la JVM cuando se inicia el dominio de WebLogic: "-Djavax.net.ssl.trustStore=%WL_HOME%\wlserver\server\lib\DemoTrust.jks". Tenemos la opción de eliminar este parámetro de inicio: eliminar "-Djavax.net.ssl.trustStore=%WL_HOME%\wlserver\server\lib\DemoTrust.jks" en el archivo setDomainEnv.cmd y luego agregar los certificados al almacén de claves Java predeterminado (cacerts) o, la opción más fácil, podemos agregar el certificado al almacén de claves DemoTrust que usa WebLogic:

 El comando para hacer esto se ejecuta de la siguiente manera:

%JAVA_HOME%\bin\keytool -import -alias smtp.gmail.com -keystore %WL_HOME%\wlserver\server\lib\DemoTrust.jks -file C:\gmail-smtp-certificate.txt

En Linux, hay que tener cuidado ya que el almacén de claves DemoTrust es propiedad del usuario del sistema operativo Oracle,  por lo tanto hay que ejecutar este comando con ese usuario.

Se le pedirá la contraseña para este almacén de claves. La contraseña predeterminada del almacén de claves DemoTrust es: DemoTrustKeyStorePassPhrase




Se le preguntará explícitamente si confía en este certificado (y está seguro de agregarlo al almacén de claves). Obviamente, tendrá que escribir "yes" para confirmar la adición al almacén de claves como muestra la figura anterior.



Reiniciar el dominio de WebLogic

El cambio en el almacén de claves es solo tomado por la JVM después de que se reinicie. Entonces, si su dominio de WebLogic se está ejecutando, ciérrelo y vuelvalo a iniciar. Ahora poder envíar un correo electrónico deberia funcionar.




Configurar el driver de correo electrónico para enviar correos con GMail

El driver de correo electrónico en el servidor gestionado por SOA Suite debe ser informado sobre nuestra intención de utilizar GMail para enviar correos electrónicos. Para ir más al punto: tenemos que configurar smtp.gmail.com como el servidor de correo saliente. Lo hacemos en el controlador de correo electrónico, en el Enterprise Manager (EM Console). Abra el nodo "User Messaging Service" y seleccione el nodo usermessaingdriver-email con clic derecho para el servidor administrado que ejecuta SOA Suite. Desde el menú desplegable, abra la opción Email Driver Properties:




Haga clic en el botón "+ Create"  para crear una nueva configuración para el controlador de correo electrónico:



En la página siguiente con las propiedades del controlador de correo electrónico, debe especificar un nombre para el nuevo driver y la dirección del remitente predeterminado: la cuenta de correo desde la cual enviar correos electrónicos (cuando un mensaje se envía, no tiene una dirección de remitente explícita). Respetando el formato propuesto por la ayuda, es decir EMAIL:correo@electronico.com:





También deberá configurar que capacidad tendrá este driver, de momento solo nos insteresa ENVIAR correos (no queremos recibir, solo enviar) es decir "SEND":



Desplácese un poco hacia abajo en la página para establecer las propiedades del servidor SMTP. Establezca la propiedad "Outgoing Mail Server" en smtp.gmail.com. La propiedad "Outgoing Mail Server Port" en 465, la propiedad "Outgoing Mail Server Security" debe establecerse en SSL. En la propiedad "Outgoing Username" debe configurarse el nombre de usuario saliente, utilizado para conectarse a GMail, debe establecerse su dirección de correo electrónico completa de GMail (por ejemplo: juan.perez@gmail.com). Configure la propiedad "Outgoing Password" con su contraseña de Google como contraseña de texto claro o use una contraseña indirecta para que la contraseña se almacene en el almacen de credenciales asignada, puede consultar eso aquí).



 Luego haga clic en el botón Test para comprobar su configuración:



Y por ultimo haga clic en el botón OK para guardar las propiedades de la configuración del controlador de correo electrónico y regresar a la página de resumen.






Enviar correo electrónico de prueba desde Enterprise Manager (EM Console)

Desde la EM Console, seleccione el nodo SOA --> soa-infra y haga clic derecho sobre el y desde el menú desplegable seleccione la opción Service Engines --> Human Workflow:

 


Aparece la página "Human Workflow Engine". Abra la pestaña "Notification Management" y haga clic en el botón "Send Test Notification...":

 

Aparecerá una ventana emergente que le permite ingresar los detalles de un correo de prueba a enviar:

Ingrese los detalles relevantes y presione el botón "Send":




Aparece un error menor: “exception.code:31018 exception.type: ERROR exception.severity: 2 exception.name: Incorrect Notification Configuration. exception.description: Incorrect Configuration : NotificationMode : NONE; Channel : email. exception.fix: NotificationMode in workflow-notification-config.xml should be either EMAIL or ALL to send Email notifications; It should be ALL to send any other type of notifications.”



 Eso suena un poco familiar. Esto significa que todavía tenemos que configurar las propiedades de "Workflow Notification". Una vez más, desde el nodo SOA --> soa-infra, abra el menú desplegable con clic derecho y seleccione SOA Administration --> Workflow Properties:



 En la página que aparece a continuación, configure la propiedad "Notification Mode" en "All" o al menos en "Email". Presione el botón Apply para guardar el cambio.





Confirme las propiedades modificadas una vez más haciendo clic en "Yes":



 Después de hacer este cambio, regresar a la página para enviar nuevamente el correo electronico de prueba. Desafortunadamente, el pequeño revés todavía está allí. Quizás se requiera un reinicio del servidor administrado para SOA Suite.




y ahora finalmente informa sutilmente que el mensaje realmente fue enviado:




Lo cual puedo confirmar en mi cliente de correo de Outlook:

  



Opcional - Permitir que GMail sea accedido desde WebLogic

Habilitar acceso - Desbloquar restriccion de GMail

Suele pasar que GMail bloquee las conexiones que se realizan desde WebLogic, para poder desbloquear esto, en las configuraciones de "Mi Cuenta" en GMail ir a "Acceso y seguridad" y al final de la pagina habilitar el acceso a aplicaciones menos seguras:




Recursos
 
Instrucciones iniciales en Using Gmail as a JIRA Mail Server (descargar certificado)
 Probablemente el mejor recurso - debería haber comenzado allí - Using GMail as Mail Server for Oracle SOA Suite 11g Notifications por Rommel Pino
También muy bueno: http://marcotello.com/oracle-soa-suite/configuring-oracle-soa-suite-ums-adapter-with-a-gmail-account/ por Marco Tello

Gmail Notification Service – Oracle Fusion Middleware School – http://www.orafmwschool.com/gmail-notification-service/
¿Cuáles son las configuraciones SMTP de Gmail?http://email.about.com/od/accessinggmail/f/Gmail_SMTP_Settings.htm
¿Cómo recupero el certificado remoto con openSSL?http://www.madboa.com/geek/openssl/#cert-retrieve
Notificación por correo electrónico con SOA Suite 11g por Craig Barr de Rubicon Redhttp://www.rubiconred.com/email-notification-soa-suite-11g/
¿Cómo registrar certificados SSL en su JVM?http://javacolors.blogspot.nl/2012/05/how-to-register-ssl-certificates-in.html

2 comentarios:

  1. PD: Si les falla el TEST al momento de probar la configuración del driver, prueben hacer lo que se explica en este articulo: https://www.rubiconred.com/email-notification-soa-suite-11g/

    ResponderEliminar
  2. he tenido problemas en soa 12.1.2, no funciona que mencionaba la nota ?

    ResponderEliminar