Certificados SSL para encriptar servicios de correo

Habitualmente utilizamos los certificados SSL para proteger el acceso a la web, conviertiendo el protocolo HTTP en HTTP + SSL o HTTPS. Lo que no es tan conocido es que esos mismos certificados pueden utilizarse, muy facilmente, para proteger otros servicios.

A continuación os muestro como podemos usar un solo certificado para proteger todos los servicios de correo proporcionados por un servidor. Supongamos que queremos utilizar el dominio correo.ejemplo.com y pedimos un certificado para ese dominio. El mismo certificado nos proporcionará HTTPS para el correo web así como IMAPS, POP3S y SMTP sobre SSL.

Obtención del certificado

sb1:/etc/courier# openssl genrsa -out correo.ejemplo.com.key.unsecure 1024  
 Generating RSA private key, 1024 bit long modulus

Creación de una petición de certificado (CSR)

sb1:/etc/courier# openssl req -new -key correo.ejemplo.com.key.unsecure -out correo.ejemplo.com.csr  
 Using configuration from /usr/lib/ssl/openssl.cnf
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter code) [AU]:ES
 State or Province Name (full name) [Some-State]:Barcelona
 Locality Name (eg, city) []:Barcelona
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:ejemplo
 Organizational Unit Name (eg, section) []:ejemplo
 Common Name (eg, YOUR name) []:correo.ejemplo.com
 Email Address []:admin@ejemplo.com

 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:
 An optional company name []:

Verificamos que todo sea correcto, especialmente el CN:

 sb1:/etc/courier# openssl req -noout -text -in correo.ejemplo.com.csr
 Using configuration from /usr/lib/ssl/openssl.cnf
 Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=ES, ST=Barcelona, L=Barcelona, O=ejemplo, OU=ejemplo, CN=correo.ejemplo.com/Email=admin@ejemplo.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:ac:29:72:c5:be:6d:51:00:d7:07:3a:48:17:13:
                    de:aa:71:54:31:0c:f2:a1:ed:d5:22:07:c2:44:c8:
                    c8:09:7b:52:4c:2d:00:87:0d:84:9e:ef:5d:d1:16:
                    f0:6c:01:3e:71:32:af:90:6a:06:53:41:02:1c:d5:
                    01:0c:bb:9a:78:3c:c1:55:6a:a0:e6:13:18:71:4f:
                    cf:99:b5:ef:6f:03:21:ed:4a:8b:23:96:a6:e9:01:
                    75:70:5c:89:0c:57:e3:01:48:07:03:fb:bb:15:7a:
                    a4:34:80:9a:ef:41:71:b7:89:39:20:3f:bd:01:25:
                    51:5d:be:ed:f0:c6:30:07:27
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: md5WithRSAEncryption
        84:14:0f:f1:cf:5b:b1:47:50:31:0d:d1:a5:19:47:06:c9:7a:
        47:7a:de:29:b2:2b:b2:a9:9b:f4:c1:c1:76:cb:56:69:93:02:
        da:67:6e:7d:65:11:8a:44:ac:e8:b6:20:8a:1b:3c:fa:e5:a5:
        90:92:0b:29:8e:ae:4c:2e:fa:5f:98:c2:01:72:4a:06:a1:ca:
        9a:43:98:0a:73:20:0d:7d:16:0a:ac:f6:ba:ad:a3:d0:ed:84:
        41:9c:a3:f2:a3:76:7d:e0:03:70:37:2f:bc:4a:2f:11:5a:23:
        14:41:fc:fd:fd:8e:e9:93:b5:4b:2e:cf:af:1f:8e:8c:2e:21:
        a5:d9

Utilizando el CSR generado, solicitamos el certificado a una CA.

Una vez obtenido el certificado, lo salvamos en disco ''/etc/courier/correo.ejemplo.com.pem'' .

Podemos utilizar la orden openssl x509 -in correo.ejemplo.com.pem -text -noout para revisar el certificado, especialmente el CN y la caducidad.

Instalación del certificado en Courier-IMAP SSL

Necesitamos combinar el certificado con la llave privada sin encriptar en un sólo fichero:

cat ''correo.ejemplo.com.key.unsecure correo.ejemplo.com.pem > correo.ejemplo.com.crt''

Eliminamos la llave dejando sólo el .crt, y restringimos sus permisos:

 sb1:/etc/courier# chmod 400 correo.ejemplo.com.crt
 sb1:/etc/courier# ls -l
 total 52
 -rw-r--r--    1 root     root         2672 Nov 14  2002 authdaemonrc
 -rw-r--r--    1 root     root           11 Nov 14  2002 authmodulelist
 -r--------    1 root     root         3141 May 25 02:06 correo.ejemplo.com.crt
 -rw-r--r--    1 root     root          708 May 22 05:17 correo.ejemplo.com.csr
 -rw-r--r--    1 root     root         8276 May 23 10:06 imapd
 -rw-r--r--    1 root     root         5696 May 25 02:11 imapd-ssl
 -rw-r--r--    1 root     root          336 Jan 29  2003 imapd.cnf
 -rw-------    1 root     root         2133 Apr 22 11:41 imapd.pem
 -rw-r--r--    1 root     root         3380 Nov 14  2002 pop3d
 -rw-------    1 root     root         3585 Apr 23 10:40 ejemplomail.crt

E indicar al servidor que utilice este nuevo certificado añadiendo

''TLS_CERTFILE=/etc/courier/correo.ejemplo.com.crt''  
</pre>  
al fichero de configuración ''/etc/courier/imapd.ssl''  
Instalación del certificado en Exim MTA (SMTP)Copiamos el certificado a ''/etc/exim4/correo.ejemplo.com.crt'' y la clave privada a ''/etc/exim4/correo.ejemplo.com.key.unsecure''.Nos aseguramos permisos restrictivos para la llave privada:  
<pre class="brush: plain">  
 sb1:/etc/exim4# chmod 640 ejemplomail.key.unsecure
 sb1:/etc/exim4# chgrp Debian-exim ejemplomail.key.unsecure
 sb1:/etc/exim4# ls -l
 total 172
 drwxr-xr-x    9 root     root         4096 May 13 15:00 conf.d
 -rw-r--r--    1 root     root         2253 May 25 05:13 correo.ejemplo.com.crt
 -r--r--r--    1 root     root          888 May 25 05:13 correo.ejemplo.com.key.unsecure
 -rw-r--r--    1 root     root        38011 Jul  1 18:51 exim4.conf.template
 -rw-r--r--    1 root     root        37235 May 13 15:08 exim4.conf.template.bk
 -rw-r--r--    1 root     root        49552 Jul 27 18:08 exim4.conf.template.dpkg-dist
 -rw-r--r--    1 root     root         1088 Oct 20 13:31 passwd
 -rw-r-----    1 root     Debian-e      112 Apr 26  2004 passwd.client
 -rw-r--r--    1 root     root         3585 May 13 15:27 ejemplomail.crt
 -rw-r-----    1 root     Debian-e      887 May 13 15:27 ejemplomail.key.unsecure
 -rw-r--r--    1 root     root          658 Oct 18 09:10 update-exim4.conf.conf
 -rw-r--r--    1 root     root          402 May 13 15:08 update-exim4.conf.conf.bk

Modificamos ''/etc/exim4/exim4.conf.template'' para modificar las siguientes entradas:

 #tls_try_verify_hosts = *

 #tls_certificate = /etc/exim4/ejemplomail.crt
 #tls_privatekey = /etc/exim4/ejemplomail.key.unsecure
 tls_certificate = /etc/exim4/correo.ejemplo.com.crt
 tls_privatekey = /etc/exim4/correo.ejemplo.com.key.unsecure

 ######################################################################