26.6. Configuración de un servidor Web seguro con SSL

Siempre que se deban transferir datos confidenciales, como información de tarjetas de crédito, entre el servidor Web y el cliente, es aconsejable contar con una conexión segura y cifrada que incluya autenticación. mod_ssl proporciona un potente cifrado mediante los protocolos de nivel de zócalo con seguridad (SSL) y de seguridad del nivel de transporte (TLS) para la comunicación HTTP entre un cliente y un servidor Web. Mediante SSL/TSL se establece una conexión privada entre el servidor Web y el cliente. Se asegura la integridad de los datos y el cliente y el servidor pueden autenticarse mutuamente.

Para este propósito, el servidor envía un certificado SSL con información que prueba la identidad válida del servidor antes de responder a cualquier petición a una URL. A su vez, de esta manera se garantiza que el servidor es el único punto final correcto de la comunicación. Además, el certificado genera una conexión cifrada entre el cliente y el servidor que puede transportar información sin el riesgo de exponer contenido importante en formato de sólo texto.

mod_ssl no implementa los protocolos SSL/TSL por sí mismo, sino que actúa como interfaz entre Apache y una biblioteca SSL. En SUSE Linux, se emplea la biblioteca OpenSSL, la cual se instala automáticamente con Apache.

El efecto más visible de usar mod_ssl con Apache es que las URL van precedidas de https:// en lugar de http://.

26.6.1. Creación de un certificado SSL

Para utilizar SSL/TSL con el servidor Web, debe crear un certificado SSL. Este certificado es necesario para la autorización entre el servidor Web y el cliente de modo que cada parte pueda identificar claramente a la otra parte. Para garantizar la integridad del certificado, debe estar firmado por una parte en la que confíen todos los usuarios.

Se pueden crear tres tipos de certificados distintos: un certificado “ficticio” con fines de prueba únicamente, un certificado autofirmado para un grupo de usuarios determinado que confíen en usted o un certificado firmado por una autoridad certificadora (CA) independiente y conocida públicamente.

La creación de un certificado es un proceso en dos pasos básicamente. En primer lugar, se genera una clave privada para la autoridad certificadora y después el certificado del servidor se firma con esta clave.

[Tip]Información adicional

Para obtener más información acerca de los conceptos y definiciones de SSL/TSL, consulte http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html.

26.6.1.1. Creación de un certificado “ficticio

La creación de un certificado ficticio es fácil. Basta con llamar al guión /usr/bin/gensslcert. De esta forma se crean o sobrescriben los archivos siguientes:

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

También se coloca una copia de ca.crt en /srv/www/htdocs/CA.crt para su descarga.

[Important]Importante

los certificados ficticios no se deben emplear nunca en un sistema de producción. Sólo se deben utilizar con fines de prueba.

26.6.1.2. Creación de un certificado autofirmado

Si está configurando un servidor Web seguro para una intranet o un grupo de usuarios definido, puede que sea suficiente firmar un certificado con su propia autoridad certificadora (CA).

La creación de un certificado autofirmado constituye un proceso interactivo en nueve pasos. Acceda al directorio /usr/share/doc/packages/apache2 y ejecute el siguiente comando: ./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom. No intente ejecutar este comando desde otra ubicación que no sea ese directorio. El programa proporciona una serie de solicitudes, algunas de las cuales requieren que el usuario proporcione información.

Procedimiento 26.1. Creación de un certificado autofirmado con mkcert.sh

  1. Decida el algoritmo de firma que se deba utilizar para los certificados.

    Elija RSA (R, valor por defecto), puesto que algunos navegadores antiguos presentan problemas con DSA.

  2. Generación de una clave privada RSA para CA (1024 bits)

    No se requiere ninguna interacción.

  3. Generación de una petición de firma de certificado X.509 para CA

    Cree aquí el nombre completo de la CA. Este paso requiere que conteste a algunas preguntas, como el país o el nombre de la organización. Escriba datos válidos, puesto que todo lo que escriba aquí se mostrará después en el certificado. No es preciso que conteste a todas las preguntas. Si alguna no se aplica a su caso o quiere dejarla en blanco, utilice “.” (un punto). El nombre común es el nombre de la CA en sí: elija un nombre con sentido, como CA de mi empresa.

  4. Generación de un certificado X.509 para la CA firmado por ella misma

    Elija la versión de certificado 3 (valor por defecto).

  5. Generación de una clave privada RSA para el servidor (1024 bits)

    No se requiere ninguna interacción.

  6. Generación de una petición de firma de certificado X.509 para el servidor

    Cree el nombre completo para la clave del servidor aquí. Las preguntas son prácticamente idénticas a las que ya ha respondido en relación con el nombre completo de la CA. La información que se proporciona aquí se aplica al servidor Web y no tiene necesariamente que ser idéntica a los datos correspondientes a la CA (por ejemplo, puede ser que el servidor esté ubicado en otro lugar).

    [Important]Selección de un nombre común

    El nombre común que escriba aquí debe ser el nombre de host completo o del servidor seguro (por ejemplo, www.ejemplo.com). Si no, el navegador advertirá de que el certificado no coincide con el servidor cuando acceda al servidor Web.

  7. Generación de un certificado X.509 firmado por la CA propia

    Elija la versión de certificado 3 (valor por defecto).

  8. Cifrado de la clave privada RSA de la CA con una contraseña codificada por razones de seguridad

    Se recomienda encarecidamente cifrar la clave privada de la CA con una contraseña, por lo que debe elegir Y e introducir una contraseña.

  9. Cifrado de la clave privada RSA del servidor con una contraseña codificada por razones de seguridad

    El cifrado de la clave del servidor con una contraseña requiere que se escriba la contraseña cada vez que se inicie el servidor Web. Con esto se dificulta el inicio automático del servidor durante el arranque o el reinicio del servidor Web. Por lo tanto, el sentido común aconseja responder N a esta pregunta. Tenga en cuenta que la clave se queda sin proteger cuando no se cifra con una contraseña y asegúrese de que sólo personas autorizadas tengan acceso a esa clave.

    [Important]Cifrado de la clave del servidor

    Si decide cifrar la clave del servidor con una contraseña, aumente el valor de APACHE_TIMEOUT en /etc/sysconfig/apache2. Si no lo hace, no tendrá tiempo suficiente para escribir la contraseña codificada antes de que el intento de inicio del servidor se pare y no tenga éxito.

La página de resultados del guión presenta una lista de los certificados y las claves que ha generado. En contra de lo que se muestra en el resultado del guión, los archivos no se generan en el directorio conf local, sino en las ubicaciones correctas dentro de /etc/apache2/.

El último paso consiste en copiar el archivo de certificado de CA de /etc/apache2/ssl.crt/ca.crt a una ubicación donde los usuarios puedan acceder a él con el fin de incorporarlo en la lista de CA conocidas y de confianza de sus navegadores Web. Si no se hace así, el navegador indicará que el certificado ha sido emitido por una autoridad desconocida. El certificado es válido durante un año.

[Important]certificados autofirmados

Sólo se deben utilizar certificados autofirmados en servidores Web a los que accedan personas que le conozcan y confíen en usted en calidad de autoridad certificadora. No se recomienda utilizar ese tipo de certificados en una tienda pública, por ejemplo.

26.6.1.3. Obtención de certificados firmados oficialmente

Existen diversas autoridades certificadoras oficiales que pueden firmar sus certificados. El certificado lo firma una parte digna de confianza, por lo que se puede confiar en él totalmente. Los servidores Web seguros públicos normalmente disponen de un certificado firmado oficialmente.

Las CA oficiales más conocidas son Thawte (http://www.thawte.com/) y Verisign (www.verisign.com). Éstas y otras CA ya están compiladas en todos los navegadores, por lo que los certificados firmados por estas autoridades se aceptan automáticamente en ellos.

Cuando se solicita un certificado firmado oficialmente, no se envía un certificado a la CA, sino que se emite una petición de firma de certificado (CSR, Certificate Signing Request). Para crear una CSR, se debe llamar al guión /usr/share/ssl/misc/CA.sh -newreq.

En primer lugar, el guión solicita una contraseña con la que se debe cifrar la CSR. Después, se le pide que escriba un nombre completo. Este paso requiere que conteste a algunas preguntas, como el país o el nombre de la organización. Escriba datos válidos: todo lo que escriba aquí se mostrará más adelante en el certificado y se comprobará. No es preciso que conteste a todas las preguntas. Si alguna no se aplica a su caso o quiere dejarla en blanco, utilice “.” (un punto). El nombre común es el nombre de la CA en sí: elija un nombre con sentido, como CA de mi empresa. Por último, se deben proporcionar una contraseña de verificación y un nombre de empresa alternativo.

La CSR se genera en el directorio desde el que se llama al guión y el archivo recibe el nombre newreq.pem.

26.6.2. Configuración de Apache con SSL

El puerto por defecto para las peticiones de SSL y TLS en el servidor Web es el 443. No hay conflicto entre una escucha “normal” de Apache en el puerto 80 y una escucha de Apache habilitada para SSL/TLS en el puerto 443. De hecho, HTTP y HTTPS pueden ejecutarse con la misma instancia de Apache. Normalmente se emplean hosts virtuales independientes para expedir peticiones al puerto 80 y al puerto 443 para servidores virtuales independientes.

[Important]Configuración del cortafuegos

No olvide abrir el puerto 443 en el cortafuegos para Apache habilitado para SSL, lo que se puede hacer mediante YaST, como se describe en Sección 4.1.4.1, “Configuración con YaST”.

Para utilizar SSL, se debe activar en la configuración de servidor global. Abra /etc/sysconfig/apache2 en un editor y busque APACHE_MODULES. Añada “ssl” a la lista de módulos si no está incluido todavía (mod_ssl se activa por defecto). A continuación, busque APACHE_SERVER_FLAGS y añada “SSL”. Si ha decidido cifrar el certificado de servidor con una contraseña, debe también aumentar el valor de APACHE_TIMEOUT con el fin de disponer del tiempo suficiente para escribir la contraseña codificada cuando se inicie Apache. Reinicie el servidor para que los cambios se activen. No basta con volver a cargarlo.

El directorio de configuración de host virtual incluye una plantilla, /etc/apache2/vhosts.d/vhost-ssl.template, con directivas específicas para SSL ampliamente documentadas. Consulte Sección 26.2.1.2, “Configuración de hosts virtuales” para conocer la configuración general del host virtual.

Para comenzar, debería bastar con ajustar los valores de las directivas siguientes:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

[Important]Hosts y SSL virtuales basados en nombres

No es posible ejecutar varios hosts virtuales habilitados para SSL en un servidor con una única dirección IP. Los usuarios que se conectan a una configuración de este tipo reciben un mensaje de advertencia en el que se les indica que el certificado no coincide con el nombre del servidor cada vez que visitan una URL. Se necesita una dirección IP o puerto distintos para cada dominio habilitado para SSL para poder comunicarse basándose en un certificado SSL válido.