Saludos amigos/as, hoy tengo el gusto de contar en el blog de nuevo con el gran Oscar Mas, en este caso no nos trae una entrada cualquiera, nos trae “la entrada”. Espero que os sirva tanto como a nosotros.
Lo que vamos a explicar y montar, es como configurar múltiples certificados en un servidor de Zimbra, sin MTA. Esta funcionalidad salió en ZImbra 7 y creo que es una buena alternativa para no tener que montar un MTA, que nos gestione múltiples certificados.
Como es bien conocido, cuando el certificado de Zimbra expira, los servicios de Zimbra dejan de funcionar. Lo que vamos a hacer es configurar la interface eth0 con un certificado autogenerado que caduque dentro de unos 100 años, de esta manera no tenemos que estar pendientes de cuando caducará el certificado. Esta interface (eth0) no será accesible desde el exterior. Los accesos se harán a través de las Interfaces alias: eth0:1, eth0:2, etc….. que es donde se gestionaran los certificados.
Generemos el certificado:
[root@zimbra ~]# /opt/zimbra/bin/zmcertmgr createcrt -new -days 36500 Validation days: 36500 ** Creating /opt/zimbra/conf/zmssl.cnf...done ** Backup /opt/zimbra/ssl/zimbra to /opt/zimbra/ssl/zimbra. 20131118204930 ** Generating a server csr for download self -new -keysize 1024 -digest sha1 ** Creating /opt/zimbra/conf/zmssl.cnf... done ** Backup /opt/zimbra/ssl/zimbra to /opt/zimbra/ssl/zimbra. 20131118204930 ** Creating server cert request /opt/zimbra/ssl/zimbra/server/ server.csr...done. ** Saving server config key zimbraSSLPrivateKey...done. ** Signing cert request /opt/zimbra/ssl/zimbra/server/ server.csr...done.
Y le hacemos un deploy:
[root@zimbra ~]# /opt/zimbra/bin/zmcertmgr deploycrt self ** Saving server config key zimbraSSLCertificate...done. ** Saving server config key zimbraSSLPrivateKey...done. ** Installing mta certificate and key...done. ** Installing slapd certificate and key...done. ** Installing proxy certificate and key...done. ** Creating pkcs12 file /opt/zimbra/ssl/zimbra/jetty.pkcs12...done. ** Creating keystore file /opt/zimbra/mailboxd/etc/ keystore...done. ** Installing CA to /opt/zimbra/conf/ca...done.
Podremos verificar que el certificado esta generado hasta el año 2113:
[root@zimbra ~]# /opt/zimbra/bin/zmcertmgr viewdeployedcrt ::service mta:: notBefore=Nov 18 19:49:40 2013 GMT notAfter=Oct 25 19:49:40 2113 GMT subject= /C=US/ST=N/A/O=Zimbra Collaboration Server/OU=Zimbra Collaboration Server/CN=zimbra.ilba.cat issuer= /C=US/ST=N/A/L=N/A/O=Zimbra Collaboration Server/OU=Zimbra Collaboration Server/CN=zimbra.ilba.cat SubjectAltName=
Configuramos las interfaces alias para alojar los diferentes certificados:
[root@zimbra ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1 DEVICE=eth0:1 IPADDR=192.168.100.21 NETMASK=255.255.255.0 NETWORK=192.168.10.0 ONBOOT=yes NAME=eth0:1 [root@zimbra ~]# vi /etc/sysconfig/network- scripts/ifcfg-eth0:2 DEVICE=eth0:2 IPADDR=192.168.100.22 NETMASK=255.255.255.0 NETWORK=192.168.10.0 ONBOOT=yes NAME=eth0:2 [root@zimbra ~]# ifup eth0:1 [root@zimbra ~]# ifup eth0:2
Nos ha de quedar así:
[root@zimbra ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:15:5D:00:68:0A inet addr:192.168.100.20 Bcast:192.168.100.255 Mask:255.255.255.0 inet6 addr: fe80::215:5dff:fe00:680a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:36988 errors:0 dropped:0 overruns:0 frame:0 TX packets:21379 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:50424823 (48.0 MiB) TX bytes:4547380 (4.3 MiB) eth0:1 Link encap:Ethernet HWaddr 00:15:5D:00:68:0A inet addr:192.168.100.21 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 eth0:2 Link encap:Ethernet HWaddr 00:15:5D:00:68:0A inet addr:192.168.100.22 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:9391 errors:0 dropped:0 overruns:0 frame:0 TX packets:9391 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:7577785 (7.2 MiB) TX bytes:7577785 (7.2 MiB)
Como es normal, partiremos de un único servidor de Zimbra con todos los servicios básicos, necesarios para su correcto funcionamiento:
[zimbra@zimbra ~]$ zmprov gs `zmhostname` | grep zimbraServiceInstalled zimbraServiceInstalled: antivirus zimbraServiceInstalled: antispam zimbraServiceInstalled: opendkim zimbraServiceInstalled: logger zimbraServiceInstalled: mailbox zimbraServiceInstalled: mta zimbraServiceInstalled: convertd zimbraServiceInstalled: stats zimbraServiceInstalled: snmp zimbraServiceInstalled: ldap zimbraServiceInstalled: spell
Lo que haremos es instalar el servicio de proxy en el propio equipo. Es importante que al instalar usemos la misma versión que tenemos instalada, a no ser que queramos actualizarla:
[zimbra@zimbra ~]$ zmcontrol -v Release 8.0.5_GA_5839.RHEL6_64_20130910124005 RHEL6_64 NETWORK edition. [root@zimbra zcs-NETWORK-8.0.5_GA_5839. RHEL6_64.20130910124005]# ./install.sh ..... Checking for existing installation... zimbra-ldap...FOUND zimbra-ldap-8.0.5_GA_5839 zimbra-logger...FOUND zimbra-logger-8.0.5_GA_5839 zimbra-mta...FOUND zimbra-mta-8.0.5_GA_5839 zimbra-snmp...FOUND zimbra-snmp-8.0.5_GA_5839 zimbra-store...FOUND zimbra-store-8.0.5_GA_5839 zimbra-apache...FOUND zimbra-apache-8.0.5_GA_5839 zimbra-spell...FOUND zimbra-spell-8.0.5_GA_5839 zimbra-convertd...FOUND zimbra-convertd-8.0.5_GA_5839 zimbra-memcached...NOT FOUND zimbra-proxy...NOT FOUND zimbra-archiving...NOT FOUND zimbra-cluster...NOT FOUND zimbra-core...FOUND zimbra-core-8.0.5_GA_5839 ZCS upgrade from 8.0.5 to 8.0.5 will be performed. ..... ..... Select the packages to install Upgrading zimbra-core Upgrading zimbra-ldap Upgrading zimbra-logger Upgrading zimbra-mta Upgrading zimbra-snmp Upgrading zimbra-store Upgrading zimbra-apache Upgrading zimbra-spell Upgrading zimbra-convertd Install zimbra-memcached [N] Install zimbra-proxy [N] Y Install zimbra-archiving [N] Checking required space for zimbra-core Checking space for zimbra-store .....
Una vez acabado de instalar, veremos que tenemos el servicio de proxy instalado:
[zimbra@zimbra ~]$ zmprov gs `zmhostname` | grep zimbraServiceInstalled zimbraServiceInstalled: antivirus zimbraServiceInstalled: antispam zimbraServiceInstalled: opendkim zimbraServiceInstalled: logger zimbraServiceInstalled: mailbox zimbraServiceInstalled: mta zimbraServiceInstalled: convertd zimbraServiceInstalled: stats zimbraServiceInstalled: proxy zimbraServiceInstalled: snmp zimbraServiceInstalled: ldap zimbraServiceInstalled: spell
Nos crearemos un directorio para alojar los certificados:
[root@zimbra ~]# mkdir /opt/zimbra/conf/domaincerts
A mi personalmente, me gusta trabajar con certificados PFX, ya que para desplegar en Windows se hace de una manera muy sencilla, pero para desplegarlos en Zimbra, necesitamos el CRT y el KEY (sin password). Lo que haremos es desde el PFX desplegar el CRT y el KEY:
[root@zimbra domaincerts]# ls -la total 16 drwxr-xr-x. 2 root root 4096 Nov 18 21:40 . drwxrwxr-x. 14 zimbra zimbra 4096 Nov 18 21:38 .. -rw-r-----. 1 root root 3205 Nov 14 07:03 WILCARD_ilba_cat.pfx -rw-r-----. 1 root root 4029 Nov 14 07:03 WILDCARD_otrodominio_com.pfx [root@zimbra domaincerts]# openssl pkcs12 -in WILCARD_ilba_cat.pfx -nocerts -out WILCARD_ilba_cat.key Enter Import Password: MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase: [root@zimbra domaincerts]# openssl pkcs12 -in WILCARD_ilba_cat.pfx -clcerts -nokeys -out WILCARD_ilba_cat.crt Enter Import Password: MAC verified OK [root@zimbra domaincerts]# openssl rsa -in WILCARD_ilba_cat.key -out WILCARD_ilba_cat_sin_password.key Enter pass phrase for WILCARD_ilba_cat.key: writing RSA key
Y lo mismo con el segundo certificado:
[root@zimbra domaincerts]# openssl pkcs12 -in WILDCARD_otrodominio_com.pfx -nocerts -out WILDCARD_otrodominio_com.key Enter Import Password: MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase: [root@zimbra domaincerts]# openssl pkcs12 -in WILDCARD_otrodominio_com.pfx -clcerts -nokeys -out WILDCARD_otrodominio_com.crt Enter Import Password: MAC verified OK [root@zimbra domaincerts]# openssl rsa -in WILDCARD_otrodominio_com.key -out WILDCARD_otrodominio_com_sin_password.key Enter pass phrase for WILDCARD_otrodominio_com.key: writing RSA key
Editamos los cuatro ficheros que nos hemos creado y los dejamos todos de la siguiente manera:
-----BEGIN CERTIFICATE----- MIIFSDCCBDCgAwIBAgIHKyvT8Hi1kz
Copiamos los certificados para que Zimbra pueda entenderlos:
[root@zimbra domaincerts]# cp WILCARD_ilba_cat.crt ilba.cat.crt [root@zimbra domaincerts]# cp WILDCARD_otrodominio_com.crt otrodominio.com.crt [root@zimbra domaincerts]# cp WILCARD_ilba_cat_sin_password.key ilba.cat.key [root@zimbra domaincerts]# cp WILDCARD_otrodominio_com_sin_ password.key otrodominio.com.key
Verificamos y hacemos un deploy de los certificados:
[root@zimbra domaincerts]# /opt/zimbra/bin/zmcertmgr verifycrt comm WILCARD_ilba_cat_sin_password.key WILCARD_ilba_cat.crt ** Verifying WILCARD_ilba_cat.crt against WILCARD_ilba_cat_sin_password. key Certificate (WILCARD_ilba_cat.crt) and private key (WILCARD_ilba_cat_sin_ password.key) match. Valid Certificate: WILCARD_ilba_cat.crt: OK [root@zimbra domaincerts]# /opt/zimbra/bin/zmcertmgr verifycrt comm WILDCARD_otrodominio_com_sin_ password.key WILDCARD_otrodominio_com.crt ** Verifying WILDCARD_otrodominio_com.crt against WILDCARD_otrodominio_com_sin_ password.key Certificate (WILDCARD_otrodominio_com.crt) and private key (WILDCARD_otrodominio_com_sin_ password.key) match. Valid Certificate: WILDCARD_otrodominio_com.crt: OK [root@zimbra domaincerts]# /opt/zimbra/libexec/ zmdomaincertmgr deploycrts [root@zimbra domaincerts]# /opt/zimbra/libexec/ zmdomaincertmgr savecrt ilba.cat WILCARD_ilba_cat.crt WILCARD_ilba_cat_sin_password. key ** Saving domain config key zimbraSSLCertificate...done. ** Saving domain config key zimbraSSLPrivateKey...done. [root@zimbra domaincerts]# /opt/zimbra/libexec/ zmdomaincertmgr savecrt otrodominio.com WILDCARD_otrodominio_com.crt WILDCARD_otrodominio_com_sin_ password.key ** Saving domain config key zimbraSSLCertificate...done. ** Saving domain config key zimbraSSLPrivateKey...done.
Asignamos un virtualhost a la ip:
[zimbra@zimbra ~]$ zmprov md ilba.cat +zimbraVirtualHostName "mail.ilba.cat" +zimbraVirtualIPAddress "192.168.100.21" [zimbra@zimbra ~]$ zmprov md otrodominio.com +zimbraVirtualHostName "mail.otrodominio.com" +zimbraVirtualIPAddress "192.168.100.22"
Verificamos que lo que hayamos puesto sea correcto:
[zimbra@zimbra ~]$ zmprov gd ilba.cat | grep Virtual zimbraVirtualHostname: mail.ilba.cat zimbraVirtualIPAddress: 192.168.100.21 [zimbra@zimbra ~]$ zmprov gd otrodominio.com | grep Virtual zimbraVirtualHostname: mail.otrodominio.com zimbraVirtualIPAddress: 192.168.100.22
Ya que vamos a user un certificado que es valido, que menos que redireccionar las peticiones http a https:
[zimbra@zimbra ~]$ zmtlsctl redirect Setting ldap config zimbraMailMode redirect for zimbra.ilba.cat...done. Rewriting config files for cyrus-sasl, webxml and mailboxd...done.
Y como siempre verificamos:
[zimbra@zimbra ~]$ zmprov gs `zmhostname` |grep zimbraMailMode zimbraMailMode: redirect
Es importante que el usuario Zimbra del sistema pueda arrancer el nginx. Hemos de verificar que tenemos la siguiente línea en el fichero:
[root@zimbra ~]# cat /etc/sudoers %zimbra ALL=NOPASSWD:/opt/zimbra/nginx/sbin/nginx
Habilitamos el “ZCS upstream server” y como siempre verificamos:
[zimbra@zimbra ~]$ zmprov ms `zmhostname` zimbraReverseProxyLookupTarget TRUE [zimbra@zimbra ~]$ zmprov gs `zmhostname` zimbraReverseProxyLookupTarget # name zimbra.ilba.cat zimbraReverseProxyLookupTarget: TRUE
Ahora ya nos queda poco. Hemos de reinciar los servicios de Zimbra, para verificar que todo funciona correctamente:
[zimbra@zimbra ~]$ zmcontrol stop && sleep 30 && zmcontrol start
Accedemos a la administración de zimbra via GUI, y habilitamos:
– Activar proxy web:
– Activar proxy de la consola de administrador:
Al activar “Activar proxy de la consola de administrador” desde ahora podremos acceder a la administración de Zimbra por el puerto 9071
Y ahora podemos verificar el correcto funcionamiento del certificado:
[root@zimbra ~]# vim /etc/hosts 192.168.100.21 mail.ilba.cat 192.168.100.22 mail.otrodominio.com [root@zimbra ~]# openssl s_client -connect mail.ilba.cat:443 [root@zimbra ~]# openssl s_client -connect mail.otrodominio.com:443
O lo podemos hacer por web interface.

Hola,
Qué buena la idea! Muchas gracias por compartirla y explicar cómo llevarla a cabo!!!
Sois unos fieras!
Sebas
Nice!
Thank you.
Thanks to you for reading.
Pues nada, que hoy montando este sistema me he equivocado y he puesto dos zimbraVirtualIPAddress…. como es normal el nginx no me ha arrancado:
zimbra@zcs:~$ zmproxyctl stop && zmproxyctl start
Stopping nginx…done.
Starting nginx…failed.
nginx start failed. reason: The configurations of zimbraVirtualHostname and zimbraVirtualIPAddress are mismatched
He teneido que borrar la ip, que me he añadido demás sin querer, la cual colisionaba con otro certificado que había puesto anteriormente, os pongo el ejemplo:
zimbra@zcs:~$ zmprov gd dominio.com | grep Virtual
zimbraVirtualHostname: mail.dominio.com
zimbraVirtualIPAddress: 10.111.28.4 <– Esta es la mala
zimbraVirtualIPAddress: 10.111.28.5
zimbra@zcs:~$ zmprov md dominio.com -zimbraVirtualIPAddress "10.111.28.4"
…y listo:
zimbra@zcs:~$ zmproxyctl stop && zmproxyctl start
Stopping nginx…nginx is not running.
Starting nginx…done.
Jorge, muy bueno tu blog. Hay mucha documentación útil sobre diversos temas de Zimbra.
Quisiera hacerte una consulta. Tengo un servidor con Zimbra 8.0.8 el cual tiene dos dominios con sus correspondientes certificados SSL, supongamos domain1.com y domain2.com.
Todo funciona de 10, excepto que el certificado de domain2.com no está instalado para SMTP y siempre utiliza el certificado del certificado de domain1.com. Con el resto de los servicios no tuve problemas (POP, IMAP, HTTPS) ya que los mismos utilizan nginx.
Alguna recomendación/solución a este problema?
Muchas gracias
tengo el mismo problema pudiste solucionarlo?