Saltar al contenido principal

CSSMTP - Enviar emails con cifrado TLS

Vamos a configurar el envío de emails desde z/OS con CSSMTP.
Desde z/OS 2.3, ya no se incluye el servidor de correo en z/OS (SMTPD). En su lugar hay que usar el cliente de correo CSSMPT.

Es necesario disponer de un servidor de correo externo para poder enviar los emails.

Haré configuración de dos maneras: sin encriptación y con encriptación (TLS).

Instalar servidor de email

aviso

Es importante tener en cuenta que el servidor externo de correos no puede tener autenticación (el comando AUTH no está disponible en CSSMTP).

En mi servidor de correo (el que uso para esta web) si es necesaria la autenticación, por lo tanto, no lo puedo usar directamente. He tenido que utilizar un servidor intermedio que no requiere autenticación para conectar desde z/OS.

He instalado un programa en mi Windows llamado hMailServer.

info

Una vez instalado, he creado un dominio y una cuenta.

En mi caso, la cuenta de correo local se llama igual que el correo que tengo configurado en el servidor de la web.
Hago esto porque el servidor de la web requiere que el usuario exista.

Si en local llamase a la cuenta de otra forma, cuando intente conectar con el servidor de la web, aparecería un error diciendo que la cuenta no existe.

Emuframe image

Configuro el servidor local y el servidor remoto que realizará el envío definitivo del correo.

Emuframe image

Para hacerlo un poco más seguro, ya que no es posible habilitar la autenticación, he creado un nuevo rango de IPs para permitir únicamente la conexión de la IP de mi zOS.

Para este nuevo rango, es obligatorio deshabilitar los campos Require SMTP authentication.

Emuframe image

Configurar CSSMTP en z/OS

Ya hemos terminado la configuración básica del servidor intermedio de correo.

Ahora hay que configurar CSSMTP en z/OS.

info

En mi caso, seguiré los pasos del siguiente enlace:
https://www.ibm.com/docs/en/zos/2.4.0?topic=cssmtp-steps-configuring-starting

Para crear la STC, podemos coger de ejemplo **.SEZAINST(CSSMTP).
Lo he copiado a mi PROCLIB y lo he adaptado de la siguiente forma:

Fichero de variables de entorno STDENV:

USER.Z24D.PARMLIB(CSSMTPEV)

Fichero de configuración CONFIG:

USER.Z24D.PARMLIB(CSSMTPCF)

Además, el fichero de LOG dejaré que se quede en el spool.

Emuframe image

En el fichero USER.Z24D.PARMLIB(CSSMTPEV), he puesto mi zona horaria:

TZ=EUROPE/MADRID
CSSMTP_CODEAGE_CONFIG=IBM-1047

En el fichero USER.Z24D.PARMLIB(CSSMTPCF), he hecho los siguientes cambios:

  • Nombre del “external writer”.
ExtWrtName  CSSMTP                   Ñ the external writer name
  • La clase que “monitorizará” la tarea.
ReportSysoutClass        A         Ñ Can specify the Sysout class
  • La IP y el puerto del servidor de correo al que conectaremos.
TargetIp      192.168.1.10    Ñ target ip address
ConnectPort 25 Ñ port to connect to target server

Emuframe image

Emuframe image

Emuframe image

Ahora arrancamos la tarea. Debemos fijarnos que aparezca el mensaje:

“EZD1821I CSSMTP ABLE TO USE TARGET SERVER …”

Emuframe image

Envío de emails sin encriptación

Una vez configurada y arrancada la tarea, probaremos que se envían los correos.

Job para envío de emails - CSSMTP

Usaré el siguiente job con un paso IEBGENER.

//MAILSEN1 JOB 0,REGION=0M,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//PAS001 EXEC PGM=IEBGENER
//SYSIN DD DUMMY
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD SYSOUT=(A,CSSMTP)
//SYSUT1 DD *
helo 192.168.1.10
mail from:<JAVIER.FERNANDEZ@EMUFRAME.COM>
rcpt to:<XXXXXX@HOTMAIL.COM>
data
From: <JAVIER.FERNANDEZ@EMUFRAME.COM>
To: <XXXXXX@HOTMAIL.COM>
SUBJECT: PRUEBA DE CORREO
CONTENT-TYPE: TEXT/HTML;
<HTML>
<BODY>
PRUEBA
<BR>
</BODY>
</HTML>
/*

Emuframe image

El job terminará correctamente.
Nos fijamos en el job ID (JOB01055).

Emuframe image

En la tarea CSSMTP, comprobaremos que el correo se ha procesado.

Emuframe image

Comprobaré mi buzón de correo para verificar que lo he recibido.

Emuframe image

Envío de emails con encriptación (TLS)

Después de ver que conecta y envía correos sin usar encriptación, voy a configurar la encriptación para hacer la entrada un poco más completa.

Para esta prueba, usaré un certificado autogenerado con OpenSSL en Windows.

Lo adecuado sería usar un certificado firmado por una autoridad de certificación (CA – Certificate Authority), pero para esta demostración no es necesario.

info

OpenSSL se puede descargar del siguiente enlace:
https://slproweb.com/products/Win32OpenSSL.html

Con los siguientes comandos generaré un certificado nuevo con clave privada para usarlo con el programa hMailServer.

Después exportaré este certificado y su clave privada a PKCS12 para importarlo en z/OS y que sea más sencillo.

Comando para generar el certificado y clave separados:

NOTA

El certificado no puede tener password de encriptación ya que en hMailServer no está soportado

openssl req -nodes -new -x509 -keyout smtp_key.pem -out smtp_cert.pem

Emuframe image

Tendremos este resultado.

Emuframe image

En hMailServer vamos a SSL certificates y pulsamos en Add.

Emuframe image

Seleccionamos los certificados que acabamos de generar y salvamos.

Emuframe image

Ahora vamos a la configuración del puerto SMTP 587 y seleccionamos STARTTLS (Required) y el certificado que acabamos de añadir al servidor.

De esta forma, cuando conectemos a este puerto, se necesitará el certificado.

info

De forma opcional, podemos borrar la configuración del puerto 25 para que únicamente esté disponible el puerto 587.

Emuframe image

Añadir certificados a RACF

Ahora tenemos que poner el certificado en z/OS, añadirlo a RACF y meterlo en un anillo.
He creado un dataset secuencial (PS), VB y LRECL 84.

Emuframe image

He copiado (copy-paste) el contenido del certificado smtp_cert.pem en ese dataset.

Emuframe image

Job para añadir un certificado a RACF

Ahora voy a añador el certificado en RACF con el siguiente job.
El ID es el usuario con el que tenemos arrancada la tarea CSSMTP (owner). En mi caso, es START1.

//$01IMPCR JOB 0,REGION=0M,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//IMPCERT1 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
RACDCERT ADD('IBMUSER.SMTP.CERT') ID(START1) TRUST +
WITHLABEL('SMTP CERTIFICATE')
/*

Emuframe image

Emuframe image

Job para crear un nuevo anillo (keyring) en RACF

El siguiente job es para crear un nuevo anillo de RACF en el que añadiremos el certificado.
El ID debe ser el mismo que el usuario con que tenemos arrancada la tarea CSSMTP.

//$02RING  JOB 0,REGION=0M,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//IMPCERT1 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
RACDCERT ID(START1) ADDRING(SMTPRING)
/*

Emuframe image

Job para conectar un certificado a un anillo (keyring) en RACF

El siguiente job conecta el certificado que hemos cargado en RACF al anillo que acabamos de crear.

//$03CONCR JOB 0,REGION=0M,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//CONNRING EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
RACDCERT ID(START1) +
CONNECT(ID(START1) LABEL('SMTP CERTIFICATE') +
RING(SMTPRING) +
DEFAULT)
/*

Emuframe image

Job REFRESH y display de un anillo (keyring) y certificados en RACF

Por último, refrescamos la configuración y mostramos la información de los anillos y del certificado.

//$04REFCR JOB 0,REGION=0M,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//REFSCER1 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
SETROPTS RACLIST(DIGTCERT, DIGTRING) REFRESH
/*
//LISTCER1 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
RACDCERT ID(START1) LISTRING(*)
/*
//LISTCER2 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
RACDCERT LIST (LABEL('SMTP CERTIFICATE')) ID(START1)
/*

Emuframe image

Configuración PAGENT - AT-TLS

En este punto, hemos terminado la parte de RACF. El siguiente paso es hacer la configuración AT-TLS en la tarea PAGENT.
Buscamos el fichero de configuración de políticas.
En mi caso, está indicado dentro del fichero de variables de entorno (DD STDENV).

Emuframe image

En mi caso, tendré revisar el fichero de configuración ADCD.Z24D.TCPPARMS(PAGENTCF) para saber el fichero de políticas.

Emuframe image

Tendré que modificar el fichero ADCD.Z24D.TCPPARMS(TLSPOLY1).

Emuframe image

Parámetros configuración PAGENT para CSSMTP

Lo importante es revisar:

  • RemotePortRange. El puerto al que conectaremos.
  • Keyring. Nombre del anillo de RACF que creamos en pasos anteriores.
  • TTLSCipherParmsRef. Yo uso el listado de Ciphers que tengo configurado en PAGENT para otras definiciones.
ÑÑ
ÑÑ TCP/IP Policy Agent AT-TLS configuration for CSSMTP
ÑÑ
ÑÑ-----------------------------
TTLSRule secure_smtp_client_rule
{
RemotePortRange 587
Direction Outbound
TTLSGroupActionRef smtp_secure_client_group
TTLSEnvironmentActionRef smtp_secure_client_env
}
TTLSGroupAction smtp_secure_client_group
{
TTLSEnabled On
}
TTLSEnvironmentAction smtp_secure_client_env
{
HandshakeRole Client
TTLSKeyRingParms
{
Keyring SMTPRING
}
TTLSEnvironmentAdvancedParms
{
ApplicationControlled On
SecondaryMap On
}
TTLSCipherParmsRef TN3270-CipherPrm_AT-TLS_Platinum
}

Emuframe image

Emuframe image

Refrescamos la configuración con el comando:

F PAGENT,REFRESH

Emuframe image

Comprobamos que se ha refrescado bien la configuración.

Emuframe image

Actualizar configuración CSSMTP

Cambiamos la configuración de CSSMTP para indicar que utilice la seguridad e indicar el nuevo puerto.

  • ConnectPort. En mi caso, 587.
  • Secure. Yes

Emuframe image

Arrancamos de nuevo CSSMPT (si estaba arrancado, lo paramos).
Comprobamos que pueda conectar con el servidor de correo.

Emuframe image

NOTA

Si hubiese algún problema con el certificado, el anillo de RACF o la configuración de políticas de PAGENT, aparecería un mensaje como el siguiente:

Emuframe image

Por último, volvemos a lanzar el job de prueba de email y confirmamos que llega al destino.

Emuframe image