Cómo crear un certificado SSL en Apache para CentOS 7

Introducción
TLS , o seguridad de la capa de transporte, y su predecesor SSL , que significa capa de sockets seguros, son protocolos web utilizados para envolver el tráfico normal en un contenedor protegido y cifrado.
Con esta tecnología, los servidores pueden enviar tráfico de forma segura entre el servidor y los clientes sin posibilidad de que los mensajes sean interceptados por terceros. El sistema de certificados también ayuda a los usuarios a verificar la identidad de los sitios a los que se conectan.
En esta guía, configurará un certificado SSL autofirmado para usar con un servidor web Apache en un servidor CentOS 7.
Nota: Un certificado autofirmado cifrará la comunicación entre su servidor y cualquier cliente. Sin embargo, dado que no está firmado por ninguna de las autoridades de certificación de confianza incluidas en los navegadores web, los usuarios no pueden utilizar el certificado para validar la identidad de su servidor automáticamente. Como resultado, los usuarios verán un error de seguridad al visitar su sitio.
Debido a esta limitación, los certificados autofirmados no son apropiados para un entorno de producción que brinde servicios al público. Por lo general, se utilizan para realizar pruebas o para proteger servicios no críticos utilizados por un solo usuario o un pequeño grupo de usuarios que pueden confiar en la validez del certificado a través de canales de comunicación alternativos.
Para obtener una solución de certificado más preparada para la producción, consulte Let’s Encrypt , una autoridad de certificación gratuita. Puede aprender a descargar y configurar un certificado Let’s Encrypt en el tutorial de configuración de Apache con un certificado Let’s Encrypt en CentOS 7 .
Prerrequisitos
Antes de comenzar con esta guía, hay algunos pasos que deben completarse primero.
- Necesitará acceso a un servidor CentOS 7 con un usuario que no sea root y que tenga
sudo
privilegios. Si aún no lo ha configurado, puede consultar la guía de configuración inicial del servidor CentOS 7 para crear esta cuenta. - También necesitará tener instalado Apache como se describe en el paso 1 del tutorial Cómo instalar el servidor web Apache en CentOS 7. Una vez completados estos pasos, puede iniciar sesión con su cuenta de usuario no root a través de SSH y continuar con el tutorial.
Paso 1 — Instalaciónmod_ssl
Para configurar el certificado autofirmado, primero debe asegurarse de que mod_ssl
esté instalado en el servidor el módulo Apache que ofrece compatibilidad con el cifrado SSL. Puede instalarlo mod_ssl
con el yum
comando:
- sudo yum install mod_ssl
El módulo se habilitará automáticamente durante la instalación y Apache podrá comenzar a usar un certificado SSL luego de reiniciarse. No es necesario realizar ningún paso adicional para mod_ssl
que esté listo para su uso.
Paso 2: Crear un nuevo certificado
Ahora que Apache está listo para usar el cifrado, puede continuar con la generación de un nuevo certificado SSL. TLS/SSL funciona mediante una combinación de un certificado público y una clave privada. La clave SSL se mantiene en secreto en el servidor y se utiliza para cifrar el contenido enviado a los clientes. El certificado SSL se comparte públicamente con cualquier persona que solicite el contenido y se puede utilizar para descifrar el contenido firmado por la clave SSL asociada.
El /etc/ssl/certs
directorio que se puede utilizar para almacenar el certificado público ya debería existir en el servidor. También deberá crear un /etc/ssl/private
directorio para almacenar el archivo de clave privada. Dado que la confidencialidad de esta clave es esencial para la seguridad, es importante bloquear los permisos para evitar el acceso no autorizado:
- sudo mkdir /etc/ssl/private
- sudo chmod 700 /etc/ssl/private
Ahora, puedes crear un par de clave y certificado autofirmado con OpenSSL en un solo comando escribiendo:
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
Se le harán una serie de preguntas. Antes de analizarlas, veamos qué sucede en el comando:
- openssl : esta es la herramienta de línea de comandos básica para crear y administrar certificados, claves y otros archivos OpenSSL.
- req : este subcomando especifica que desea utilizar la gestión de solicitudes de firma de certificados (CSR) X.509. “X.509” es un estándar de infraestructura de clave pública que SSL y TLS respetan para la gestión de claves y certificados. Desea crear un nuevo certificado X.509, por lo que está utilizando este subcomando.
- -x509 : Esto modifica aún más el subcomando anterior al indicarle a la utilidad que desea crear un certificado autofirmado en lugar de generar una solicitud de firma de certificado, como sucedería normalmente.
- -nodes : Esto le indica a OpenSSL que omita la opción de proteger su certificado con una frase de contraseña. Necesita que Apache pueda leer el archivo, sin la intervención del usuario, cuando se inicia el servidor. Una frase de contraseña evitaría que esto suceda porque tendría que ingresarla después de cada reinicio.
- -days 365 : esta opción establece el período de tiempo durante el cual se considerará válido el certificado. Aquí se establece en un año.
- -newkey rsa:2048 : especifica que desea generar un nuevo certificado y una nueva clave al mismo tiempo. No creó la clave necesaria para firmar el certificado en un paso anterior, por lo que debe crearla junto con el certificado. Esta
rsa:2048
parte le indica que cree una clave RSA de 2048 bits de longitud. - -keyout : esta línea le indica a OpenSSL dónde colocar el archivo de clave privada generado que está creando.
- -out : Esto le indica a OpenSSL dónde colocar el certificado que está creando.
Como se indicó anteriormente, estas opciones crearán un archivo de clave y un certificado. Se le harán algunas preguntas sobre su servidor para poder incorporar la información correctamente en el certificado.
Complete las indicaciones apropiadamente.
Nota: Es importante que ingreses tu nombre de dominio o la dirección IP pública de tu servidor cuando se te solicite Common Name (e.g. server FQDN or YOUR name)
. El valor aquí debe coincidir con el modo en que tus usuarios acceden a tu servidor.
La totalidad de las indicaciones se verá así:
OutputCountry Name (2 letter code) [XX]:USState or Province Name (full name) []:ExampleLocality Name (eg, city) [Default City]:Example Organization Name (eg, company) [Default Company Ltd]:Example IncOrganizational Unit Name (eg, section) []:Example DeptCommon Name (eg, your name or your server's hostname) []:your_domain_or_ipEmail Address []:webmaster@example.com
Ambos archivos que ha creado se colocarán en los subdirectorios apropiados del /etc/ssl
directorio.
Como está utilizando OpenSSL, también debe crear un grupo Diffie-Hellman sólido, que se utiliza para negociar la confidencialidad perfecta hacia adelante con los clientes.
Puedes hacer esto escribiendo:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Esto puede tomar unos minutos, pero cuando esté hecho tendrás un grupo DH fuerte /etc/ssl/certs/dhparam.pem
que podrás usar en tu configuración.
Paso 3: Configuración del certificado
Ahora tienes todos los componentes necesarios de la interfaz terminada. El siguiente paso es configurar los hosts virtuales para que muestren el nuevo certificado.
Abra un nuevo archivo en el /etc/httpd/conf.d
directorio:
- sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf
Pegue la siguiente configuración mínima de VirtualHost:
/etc/httpd/conf.d/tu_dominio_o_ip.conf
VirtualHost *:443 ServerName your_domain_or_ip DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key/VirtualHost
Asegúrese de actualizar la ServerName
línea con la dirección que desee asignar a su servidor. Puede ser un nombre de host, un nombre de dominio completo o una dirección IP. Asegúrese de que lo que elija coincida con lo que Common Name
eligió al crear el certificado.
Configuración de parámetros SSL seguros
A continuación, agregará algunas opciones SSL adicionales que aumentarán la seguridad de su sitio. Las opciones que utilizará son recomendaciones de Cipherlist.eu . Este sitio está diseñado para proporcionar configuraciones de cifrado fáciles de usar para software popular.
Nota: Las configuraciones predeterminadas sugeridas en Cipherlist.eu ofrecen una seguridad sólida. A veces, esto se produce a costa de una mayor compatibilidad con los clientes. Si necesita brindar soporte a clientes más antiguos, existe una lista alternativa a la que puede acceder haciendo clic en el enlace etiquetado como “Sí, deme un conjunto de cifrado que funcione con software heredado/antiguo”.
La lista de compatibilidad se puede utilizar en lugar de las sugerencias predeterminadas en la configuración anterior entre los dos bloques de comentarios. La elección de la configuración que utilice dependerá en gran medida de lo que necesite admitir.
Hay algunas partes de la configuración que quizás desees modificar. Primero, puedes agregar a la resolver
directiva tu solucionador DNS preferido para solicitudes ascendentes. Usaste el de Google para esta guía, pero puedes cambiarlo si tienes otras preferencias.
Por último, deberías tomarte un momento para leer sobre HTTP Strict Transport Security, o HSTS , y específicamente sobre la funcionalidad de “precarga” . La precarga de HSTS proporciona mayor seguridad, pero puede tener consecuencias de gran alcance si se habilita accidentalmente o de manera incorrecta. En esta guía, no precargarás la configuración, pero puedes modificarla si estás seguro de comprender las implicaciones.
Los otros cambios que realizarás son eliminar +TLSv1.3
y comentar las directivas SSLSessionTickets
y SSLOpenSSLConfCmd
, ya que no están disponibles en la versión de Apache incluida con CentOS 7.
Pegue la configuración del sitio después del final del VirtualHost
bloque:
/etc/httpd/conf.d/tu_dominio_o_ip.conf
. . ./VirtualHost. . .# Begin copied text# from https://cipherli.st/SSLCipherSuite EECDH+AESGCM:EDH+AESGCM# Requires Apache 2.4.36 OpenSSL 1.1.1SSLProtocol -all +TLSv1.2# SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1# Older versions# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1SSLHonorCipherOrder On# Disable preloading HSTS for now. You can use the commented out header line that includes# the "preload" directive if you understand the implications.#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"# Requires Apache = 2.4SSLCompression offSSLUseStapling onSSLStaplingCache "shmcb:logs/stapling-cache(150000)"# Requires Apache = 2.4.11# SSLSessionTickets Off
Cuando haya terminado de realizar estos cambios, puede guardar y cerrar el archivo.
Creación de una redirección de HTTP a HTTPS (opcional)
En la actualidad, el servidor proporcionará tráfico HTTP sin cifrar y tráfico HTTPS cifrado. Para mayor seguridad, se recomienda en la mayoría de los casos redirigir HTTP a HTTPS automáticamente. Si no desea o no necesita esta funcionalidad, puede omitir esta sección sin problemas.
Para redirigir todo el tráfico para que esté cifrado con SSL, cree y abra un archivo que termine en .conf
el /etc/httpd/conf.d
directorio:
- sudo vi /etc/httpd/conf.d/non-ssl.conf
En el interior, crea un VirtualHost
bloque para que coincida con las solicitudes en el puerto 80. En el interior, utiliza la ServerName
directiva para que coincida nuevamente con tu nombre de dominio o dirección IP. Luego, utiliza Redirect
para que coincida con las solicitudes y las envíes al SSL VirtualHost
. Asegúrate de incluir la barra diagonal final:
/etc/httpd/conf.d/non-ssl.conf
VirtualHost *:80 ServerName your_domain_or_ip Redirect "/" "https://your_domain_or_ip/"/VirtualHost
Guarde y cierre este archivo cuando haya terminado.
Paso 4: Aplicar los cambios de configuración de Apache
A esta altura, ya ha creado un certificado SSL y ha configurado su servidor web para aplicarlo a su sitio. Para aplicar todos estos cambios y comenzar a utilizar su cifrado SSL, puede reiniciar el servidor Apache para volver a cargar sus configuraciones y módulos.
Primero, verifique su archivo de configuración para detectar errores de sintaxis escribiendo:
- sudo apachectl configtest
Mientras el resultado finalice con Syntax OK
, podrá continuar sin problemas. Si esto no forma parte de su resultado, verifique la sintaxis de sus archivos e inténtelo nuevamente:
Output. . .Syntax OK
Reinicie el servidor Apache para aplicar los cambios escribiendo:
- sudo systemctl restart httpd.service
A continuación, asegúrese de que los puertos 80 y 443 estén abiertos en su firewall. Si no tiene un firewall, puede saltar este paso.
Si tiene un firewalld
firewall ejecutándose, puede abrir estos puertos escribiendo:
- sudo firewall-cmd --add-service=http
- sudo firewall-cmd --add-service=https
- sudo firewall-cmd --runtime-to-permanent
Si tiene iptables
un firewall en funcionamiento, los comandos que debe ejecutar dependen en gran medida de su conjunto de reglas actual. Para un conjunto de reglas básico, puede agregar acceso HTTP y HTTPS escribiendo lo siguiente:
- sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
- sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Paso 5: Prueba de cifrado
Ahora está listo para probar su servidor SSL.
Abra su navegador web y escriba https://
seguido del nombre de dominio o IP de su servidor en la barra de direcciones:
https://your_domain_or_ip
Debido a que el certificado que creó no está firmado por una de las autoridades de certificación confiables de su navegador, es probable que vea una advertencia de aspecto aterrador como la que se muestra a continuación:
Esto es normal y esperado. Solo le interesa el aspecto de cifrado de su certificado, no la validación de terceros de la autenticidad de su servidor. Haga clic en “AVANZADO” y luego en el enlace proporcionado para continuar con su servidor de todos modos:
Deberías ser redirigido a tu sitio. Si miras la barra de direcciones del navegador, verás alguna indicación de seguridad parcial. Puede ser un candado con una “x” encima o un triángulo con un signo de exclamación. En este caso, esto solo significa que el certificado no se puede validar. Sigue cifrando tu conexión.
Si ha configurado Apache para redirigir las solicitudes HTTP a HTTPS, también puede comprobar si la redirección funciona correctamente:
http://your_domain_or_ip
Si el resultado es el mismo icono, significa que la redirección funcionó correctamente.
Conclusión
Ha configurado su servidor Apache para que gestione solicitudes HTTP y HTTPS. Esto le ayudará a comunicarse con los clientes de forma segura y evitará que terceros puedan leer su tráfico.
Si planea utilizar SSL para un sitio web público, probablemente debería comprar un certificado SSL de una autoridad de certificación confiable para evitar que se muestren advertencias alarmantes a cada uno de sus visitantes.
Deja una respuesta