Los certificados SSL se utilizan para brindar seguridad adicional a los usuarios que acceden a su aplicación. Cifrará el tráfico entre el servidor y el cliente. Let's Encrypt es una Autoridad de Certificación (CA). Proporciona certificados TLS/SSL gratuitos para habilitar HTTPS encriptado en servidores web. Es una autoridad de certificación automatizada, gratuita y abierta.
Aquí en LinuxAPT, como parte de nuestros Servicios de Administración de Servidores, ayudamos regularmente a nuestros Clientes a realizar consultas relacionadas con Let's Encrypt.
En este contexto, veremos cómo asegurar apache con Let's Encrypt en CentOS 7 mediante la instalación del certificado SSL gratuito de Let's Encrypt.
¿Cómo instalar Let's Encrypt en CentOS 7?
Los certificados Let's Encrypt SSL son válidos durante 90 días a partir de la fecha de emisión. Como norma, los principales navegadores confían actualmente en los certificados SSL de Let's Encrypt.
Antes de embarcarse en este procedimiento de instalación, asegúrese de que se cumplan los siguientes requisitos previos:
- Un sistema que ejecuta CentOS 7 con un usuario no root con privilegios sudo.
- Apache debe estar instalado y configurado, como se menciona en este tutorial.
- Tenga un host virtual apache para su dominio, como se menciona en este tutorial.
- Su nombre de dominio debe apuntar a la dirección IP de su servidor.
1. Instalar el cliente de Certbot
Comience instalando el paquete de cliente de Certbot en su servidor para obtener un certificado SSL de Let's Encrypt. El Certbot es una herramienta utilizada para obtener certificados SSL de Let's Encrypt y habilitar automáticamente HTTPS en su servidor.
El paquete certbot es proporcionado por EPEL. Entonces necesitamos habilitar el repositorio EPEL escribiendo:
$ sudo yum install epel-release
Ahora instale el cliente certbot ejecutando el siguiente comando:
$ sudo yum install httpd mod_ssl python-certbot-apache
Compruebe la instalación de certbot por tipo:
$ certbot --version
Si la instalación es exitosa, le mostrará la versión de certbot.
2. Configurar el cortafuegos
Si no está utilizando un cortafuegos, puede pasar a continuación.
Para instalar SSL en su servidor web, debe asegurarse de que los puertos 80 y 443 estén abiertos en su firewall. Puede abrir puertos dentro de firewalld usando los siguientes comandos:
$ sudo firewall-cmd --add-service=http
$ sudo firewall-cmd --add-service=https
$ sudo firewall-cmd --runtime-to-permanent
Si en su servidor se está ejecutando iptables, debe ejecutar los siguientes comandos para habilitar el tráfico en el puerto 80 y el puerto 443:
$ sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
3. Configure Let's Encrypt SSL en Apache
Ahora todo está listo, solicitaremos obtener un certificado SSL de Let's Encrypt. Solicitar usando certbot es un proceso muy sencillo. Let's Encrypt validará la propiedad del dominio y, si tiene éxito, emitirá un SSL para un dominio solicitado. Hay varias formas de obtener un certificado de Let's Encrypt a través de complementos. Ejecute el siguiente comando para solicitar SSL:
$ sudo certbot --apache -d example.com -d www.example.com
En el comando anterior, solicitará un certificado SSL para los dominios example.com y www.example.com.
Si está ejecutando certbot por primera vez, le pedirá que ingrese una dirección de correo electrónico, que se puede usar para enviar alertas por correo electrónico relacionadas con la renovación y el vencimiento de SSL. También le pedirá que acepte los términos del servicio.
Después de hacerlo, certbot se comunicará con el servidor Let's Encrypt y luego ejecutará un desafío para verificar que eres el propietario del dominio para el que solicitas un certificado.
Si la validación tuvo éxito, le preguntará cómo le gustaría configurar sus ajustes de HTTPS:
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Seleccione su elección y continúe con el siguiente paso. Le recomendamos que elija la opción Redirigir si no desea cambiar el archivo de configuración manualmente.
Al final, le mostrará un mensaje exitoso.
Finalmente, su dominio está seguro con el certificado Let's Encrypt SSL. Puede verificar visitando su sitio con protocolo HTTPS.
Otras configuraciones SSL seguras para Apache
La configuración SSL predeterminada de CentOS con la versión de Apache está desactualizada, por lo que es menos segura y crea problemas de seguridad. Así que necesitamos cambiar algunas configuraciones para hacerlo más seguro.
Para configurar opciones más seguras relacionadas con SSL, abra el archivo ssl.conf:
$ sudo vi /etc/httpd/conf.d/ssl.conf
Primero, debe encontrar las líneas SSLProtocol y SSLCipherSuit dentro del archivo y comentarlas o puede eliminar esas dos líneas:
# SSLProtocol all -SSLv2
. . .
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
Now append the following lines after VirtualHost block in /etc/httpd/conf.d/ssl.conf file.
. . .
. . .
# Begin copied text
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder 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"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
A continuación, guarde y cierre el archivo. Necesitamos reiniciar el servicio de Apache para que los cambios surtan efecto.
Ejecute el siguiente comando:
$ sudo systemctl restart httpd
¿Cómo realizar la renovación automática del certificado Let's Encrypt SSL?
Los certificados SSL de Let's Encrypt son válidos durante 90 días, por lo que debe renovarlos antes de que caduquen. Para renovar automáticamente los certificados antes de que caduquen, crearemos un cronjob que se ejecutará dos veces al día y renovará automáticamente cualquier certificado 30 días antes de su vencimiento.
Editemos el crontab para crear un nuevo trabajo con el siguiente comando:
$ sudo crontab -e
Agregue las siguientes líneas al final del archivo para que se ejecute dos veces en un día:
0 */12 * * * /usr/bin/certbot renew >> /var/log/le-renew.log
Guarde y cierre el archivo. Para que entre en vigor, Apache se reiniciará automáticamente si se renueva algún certificado.
Puede probar el proceso de renovación, puede usar el comando certbot seguido del interruptor de ejecución en seco:
$ sudo certbot renew --dry-run
Si no hay ningún error, significa que el proceso de renovación fue exitoso.