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
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.
Lo he descargado de:
https://www.hmailserver.com/download
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.
Configuro el servidor local y el servidor remoto que realizará el envío definitivo del correo.
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.
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.
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.
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
Ahora arrancamos la tarea. Debemos fijarnos que aparezca el mensaje:
“EZD1821I CSSMTP ABLE TO USE TARGET SERVER …”
Envío de emails sin encriptación
Una vez configurada y arrancada la tarea, probaremos que se envían los correos.
Se puede usar cualquiera de los siguientes métodos: https://www.ibm.com/docs/en/zos/2.4.0?topic=suc-steps-creating-mail-jes-spool-data-set-cssmtp
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>
/*
El job terminará correctamente.
Nos fijamos en el job ID (JOB01055).
En la tarea CSSMTP, comprobaremos que el correo se ha procesado.
Comprobaré mi buzón de correo para verificar que lo he recibido.
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.
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:
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
Tendremos este resultado.
En hMailServer vamos a SSL certificates y pulsamos en Add.
Seleccionamos los certificados que acabamos de generar y salvamos.
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.
De forma opcional, podemos borrar la configuración del puerto 25 para que únicamente esté disponible el puerto 587.
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.
He copiado (copy-paste) el contenido del certificado smtp_cert.pem en ese dataset.
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')
/*
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)
/*
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)
/*
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)
/*
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).
En mi caso, tendré revisar el fichero de configuración ADCD.Z24D.TCPPARMS(PAGENTCF) para saber el fichero de políticas.
Tendré que modificar el fichero ADCD.Z24D.TCPPARMS(TLSPOLY1).
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
}
Refrescamos la configuración con el comando:
F PAGENT,REFRESH
Comprobamos que se ha refrescado bien la configuración.
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
Arrancamos de nuevo CSSMPT (si estaba arrancado, lo paramos).
Comprobamos que pueda conectar con el servidor de correo.
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:
Por último, volvemos a lanzar el job de prueba de email y confirmamos que llega al destino.