Configuración de Apache con soporte SSL/TLS.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2016 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

Acerca de HTTPS.

HTTPS es la versión segura del protocolo HTTP, inventada en 1996 por Netscape Communications Corporation. Es un protocolo dependiente de HTTP, consistiendo de una combinación de éste con un mecanismo de transporte SSL o TLS, garantizando así una protección razonable durante la comunicación cliente-servidor. Es ampliamente utilizado en la red mundial (WWW o World Wide Web) para comunicaciones como transacciones bancarias y pago de bienes y servicios.

El servicio utiliza el puerto 443 por TCP para realizar las comunicaciones (la comunicación normal para HTTP utiliza el 80 por TCP). El esquema URI (Uniform Resource Identifier o Identificador Uniforme de Recursos) es, comparando sintaxis, idéntico al de HTTP (http:), utilizándose como «https:» seguido del subconjunto denominado URL (Uniform Resource Locator o Localizador Uniforme de Recursos). Ejemplo: https://www.empresa.com.mx/

URL: http://es.wikipedia.org/wiki/HTTPS y http://wp.netscape.com/eng/ssl3/draft302.txt

Acerca de RSA.

RSA, acrónimo de los apellidos de sus autores, Ron Rivest, Adi Shamir y Len Adleman, es un algoritmo para el ciframiento de claves públicas que fue publicado en 1977, patentado en EE.UU. en 1983 por el Instituto Tecnológico de Michigan (MIT). RSA es utilizado ampliamente en todo el mundo para los protocolos destinados para el comercio electrónico.

URL: http://es.wikipedia.org/wiki/RSA

Acerca de Triple DES.

Triple DES o TDES, es un algoritmo que realiza un triple cifrado DES, desarrollado por IBM en 1978. Su origen tuvo como finalidad el agrandar la longitud de una clave sin necesidad de cambiar el algoritmo de ciframiento, lo cual lo hace más seguro que el algoritmo DES, obligando a un atacante el tener que triplicar el número de operaciones para poder hacer daño. A pesar de que actualmente está siendo reemplazado por el algoritmo AES (Advanced Encryption Standard, también conocido como Rijndael), sigue siendo estándar para las tarjetas de crédito y operaciones de comercio electrónico.

URL: http://es.wikipedia.org/wiki/Triple_DES

Acerca de X.509.

X.509 es un estándar ITU-T (estandarización de Telecomunicaciones de la International Telecommunication Union) para infraestructura de claves públicas (PKI o Public Key Infrastructure). Entre otras cosas, establece los estándares para certificados de claves públicas y un algoritmo para validación de ruta de certificación. Este último se encarga de verificar que la ruta de un certificado sea válida bajo una infraestructura de clave pública determinada. Es decir, desde el certificado inicial, pasando por certificados intermedios, hasta el certificado de confianza emitido por una Autoridad Certificadora (CA o Certification Authority).

URL: http://es.wikipedia.org/wiki/X.509

Acerca de OpenSSL.

OpenSSL es una implementación libre, de código abierto, de los protocolos SSL (Secure Sockets Layer o Nivel de Zócalo Seguro) y TLS (Transport Layer Security o Seguridad para Nivel de Transporte). Está basado sobre el extinto proyecto SSLeay, iniciado por Eric Young y Tim Hudson, hasta que éstos comenzaron a trabajar para la división de seguridad de EMC Corporation.

URL: http://www.openssl.org/

Acerca de mod_ssl.

Mod_ssl es un módulo para el servidor HTTP Apache, el cual provee soporte para SSL versiones 2 y 3 y TLS versión 1. Es una contribución de Ralf S. Engeschall, derivado del trabajo de Ben Laurie.

URL: http://www.apache-ssl.org/ y http://httpd.apache.org/docs/2.2/mod/mod_ssl.html

Requisitos.

Es necesario disponer de una dirección IP pública para cada sitio de red virtual que se quiera configurar con soporte SSL/TLS. Debido a la naturaleza de los protocolos SSL y TLS, es imposible utilizar múltiples anfitriones virtuales con soporte SSL/TLS utilizando una misma dirección IP. Cada certificado utilizado requerirá una dirección IP independiente en el anfitrión virtual.

El paquete mod_ssl instala el archivo /etc/httpd/conf.d/ssl.conf, mismo que es innecesario modificar si se utilizan archivos de inclusión, con extensión *.conf, dentro del directorio /etc/httpd/conf.d/. Ésto se recomienda a fin de preservar la configuración predeterminada y poder disponer de ésta, brindando un punto de retorno en el caso de que alguna configuración diese problemas, limitándose sólo a modificar las opciones del archivo ssl.conf para configurar las rutas del certificado y firma digital.

Modificaciones necesarias en el muro cortafuegos.

Es necesario abrir —además del puerto 80— el puerto 443 por TCP (https). Configure el muro cortafuegos como se describe en el documento titulado «Configuración básica de Apache»

Equipamiento lógico necesario.

Instalación a través de yum.

Ejecute los siguiente si se utiliza de CentOS o bien Red Hat™ Enterprise Linux:

yum -y install mod_ssl

Procedimientos.

Generando firma digital y certificado.

Acceda al sistema como root.

Durante los siguiente procedimientos se utilizará `hostname` para calcular automáticamente el nombre de anfitrión del servidor. Ejecute lo siguiente para verificar cuál es el nombre de anfitrión del sistema y lo que será utilizado automáticamente en el nombre de los archivos de certificados y firmas digitales.

De existir, elimine los archivos de certificados y firmas digitales previos.

rm -f /etc/pki/tls/*/`hostname`.*

Se debe crear una clave con algoritmo RSA de 4096 octetos y estructura x509, la cual se cifra utilizado Triple DES (Data Encryption Standard), almacenado en formato PEM de modo que sea interpretable como texto ASCII. se solicitará una contraseña para asignar a la firma digital, por lo que se recomienda utilizar una muy buena contraseña, la cual, mientras más complicada y difícil sea, mejor.

openssl genrsa -des3 \
    -out /etc/pki/tls/private/`hostname`.key 4096

Si se utiliza el archivo *.key para la configuración del anfitrión virtual, se requerirá de interacción del administrador cada vez que se tenga que iniciar o reiniciar el servicio httpd, ingresando la contraseña de la firma digital. Este es el procedimiento más seguro, sin embargo, debido a que requiere tener que ingresar una contraseña cada vez que se inicie el servicio httpd, resulta más conveniente generar una firma digital RSA, la cual permita iniciar normalmente el servicio y sin interacción alguna.

openssl rsa \
    -in /etc/pki/tls/private/`hostname`.key \
    -out /etc/pki/tls/private/`hostname`.pem

El archivo *.pem será el que se especifique más adelante como valor de la opción SSLCertificateKeyFile en la configuración de Apache.

Ejecute lo siguiente para crear el archivo CSR (Certificate Signing Request):

openssl req -sha256 -new \
    -key /etc/pki/tls/private/`hostname`.key \
    -out /etc/pki/tls/certs/`hostname`.csr

Lo anterior solicitará se ingresen varios datos:

La salida será similar a la siguiente:

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) [GB]:MX
State or Province Name (full name) [Berkshire]:Distrito Federal
Locality Name (eg, city) [Newbury]:Mexico
Organization Name (eg, company) [My Company Ltd]:Empresa, S.A. de C.V.
Organizational Unit Name (eg, section) []:Direccion Comercial
Common Name (eg, your name or your server's hostname) []:www.empresa.com.mx
Email Address []:alguien@algo.com

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

El archivo de solicitud CSR resultante es el que se entrega al Autoridad de Certificación o Registration Authority —como Verisign, Comodo, Geotrust, etc.— que a su vez entrega de vuelta un archivo de certificado firmado.

Ejecute lo siguiente para crear un certificado auto-firmado con estructura X.509 en el que se establece una validez por 1825 días (5 años):

openssl x509 -sha256 -req -days 1825 \
    -in /etc/pki/tls/certs/`hostname`.csr \
    -signkey /etc/pki/tls/private/`hostname`.key \
    -out /etc/pki/tls/certs/`hostname`.crt

Cambie los permisos de todos los archivos creados a lectura y escritura sólo para root.

chmod 600 /etc/pki/tls/*/`hostname`.*

Configuración simple de Apache para un único dominio.

Confirme cuál es el nombre de anfitrión del sistema:

hostname

Edite el archivo /etc/httpd/conf.d/ssl.conf:

vim /etc/httpd/conf.d/ssl.conf

Localice lo siguiente:

#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

Cambie localhost.crt y localhost.key por www.empresa.com.mx.crt y www.empresa.com.mx.pem, donde www.empresa.com.mx es sólo un ejemplo hipotético y corresponde al nombre de anfitrión del servidor:

#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/www.empresa.com.mx.crt

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/www.empresa.com.mx.pem

Localice lo siguiente:

#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
SSLProtocol all -SSLv2

Notará que está deshabilitado el protocolo SSLv2. Por razones de seguridad es buena idea deshabilitar también el soporte para SSLv3. Es un protocolo muy inseguro y susceptible a la tristemente célebre vulnerabilidad conocida como POODLE. Si atacantes explotan exitosamente esta vulnerabilidad sólo necesitan hacer alrededor de 256 solicitudes SSL 3.0 para revelar datos de las conexiones cifradas. Lo más inteligente que puede hacer cualquier administrador de sistemas es deshabilitar el soporte para SSLv3.

#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
SSLProtocol all -SSLv2 -SSLv3

Reinicie el servicio para que surtan efecto los cambios:

service httpd restart

Lo anterior deberá de proceder sin solicitar la contraseña de la firma digital. Si se solicita una contraseña, significa que estableció www.empresa.com.mx.key como valor de la opción SSLCertificateKeyFile en la configuración de Apache.

Configuración de Apache para múltiples dominios.

Omita el procedimiento anterior.

Es importante resaltar que cada dominio deberá contar con su propia dirección IP, pues el protocolo HTTPS impedirá utilizar más de un certificado por dirección IP.

El primer paso consiste en crear la estructura de directorios para el anfitrión virtual.

mkdir -p /var/www/dominio/{cgi-bin,html,logs,etc}

De todos directorios creados, sólo /var/www/dominio/html, /var/www/dominio/etc y /var/www/dominio/cgi-bin pueden pertenecer a un usuario sin privilegios, quien administrará este anfitrión virtual.

Crear el archivo /etc/httpd/conf.d/dominio.conf:

vim /etc/httpd/conf.d/dominio.conf

Adaptar la siguiente plantilla como contenido de este archivo, donde a.b.c.d corresponde a una dirección IP y dominio corresponde al nombre de dominio a configurar para el anfitrión virtual:

### dominio ###
NameVirtualHost a.b.c.d:80
	<VirtualHost a.b.c.d:80>
		ServerAdmin webmaster@dominio
		DocumentRoot /var/www/dominio/html
		ServerName www.dominio
		ServerAlias dominio
		Redirect 301 / https://www.dominio/
		CustomLog logs/dominio-access_log combined
		Errorlog logs/dominio-error_log
	</VirtualHost>

NameVirtualHost a.b.c.d:443
	<VirtualHost a.b.c.d:443>
		ServerAdmin webmaster@dominio
		DocumentRoot /var/www/dominio/html
		ServerName www.dominio
		ScriptAlias /cgi-bin/ /var/www/dominio/cgi-bin/
		<Directory "/var/www/dominio/cgi-bin">
			SSLOptions +StdEnvVars
		</Directory>
		SSLEngine on
		SSLProtocol all -SSLv2 -SSLv3
		SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
		SSLCertificateFile /etc/pki/tls/certs/dominio.crt
		SSLCertificateKeyFile /etc/pki/tls/private/dominio.pem
		SetEnvIf User-Agent ".*MSIE.*" \
			nokeepalive ssl-unclean-shutdown \
			downgrade-1.0 force-response-1.0
		CustomLog logs/dominio-ssl_request_log \
			"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
		Errorlog logs/dominio-ssl_error_log
		TransferLog logs/dominio-ssl_access_log
		LogLevel warn
	</VirtualHost>

A fin de que surtan efecto los cambios, es necesario reiniciar el servicio httpd.

service httpd restart

Lo anterior deberá de proceder sin solicitar la contraseña de la firma digital (la que asignó cuando se creo dominio.key). En caso contrario, significa que estableció dominio.key como valor de la opción SSLCertificateKeyFile en la configuración de Apache.

Comprobación.

Acceda con cualquier navegador HTTP hacia https://www.dominio/ a fin de verificar que todo esté trabajando correctamente. Tras aceptar el certificado, en el caso de que éste no haya sido firmado por un RA, deberá poderse observar un signo en la barra de estado del navegador, el cual indica que se trata de una conexión segura.