[toc]
# Apache2 y certificado SSL autofirmado
<p style="text-align: justify;">
Vamos a configurar Apache2 con un certificado SSL autofirmado para el dominio email.ccuellar.test. Esto permitirá que tu servidor web funcione con HTTPS sin depender de un proveedor externo.
## Crear el directorio del sitio y el archivo index.html
Crea el directorio para el sitio web y define un archivo index.html personalizado:
sudo mkdir -p /var/www/html/email.ccuellar.test
sudo vi /var/www/html/email.ccuellar.test/index.html
Añade el siguiente contenido al archivo:
<!DOCTYPE html>
<html>
<head>
<title>Bienvenido a email.ccuellar.test</title>
</head>
<body>
<center><h1>Hola Este es el sitio de email.ccuellar.test!</h1></center>
</body>
</html>
Asigna los permisos correctos:
sudo chown -R www-data:www-data /var/www/html/email.ccuellar.test
sudo chmod -R 755 /var/www/html
## Configurar el VirtualHost para HTTP (puerto 80)
Crea el archivo de configuración para el sitio:
sudo vi /etc/apache2/sites-available/email.ccuellar.test.conf
Añade la siguiente configuración:
<VirtualHost *:80>
ServerAdmin root@ccuellar.test
ServerName email.ccuellar.test
DocumentRoot /var/www/html/email.ccuellar.test
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/email.ccuellar.test>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Verifica la sintaxis de la configuración:
sudo apache2ctl configtest
<p style="text-align: justify;">
Si recibes un mensaje sobre el nombre del servidor, edita el archivo global de Apache:
sudo vi /etc/apache2/apache2.conf
Añade esta línea al final:
ServerName email.ccuellar.test
Guarda el archivo y vuelve a verificar la sintaxis:
sudo apache2ctl configtest
<p style="text-align: justify;">
Habilita el sitio y deshabilita el sitio por defecto (si existe):
sudo a2dissite 000-default.conf
sudo a2ensite email.ccuellar.test.conf
sudo a2enmod rewrite
Reinicia Apache2 para aplicar los cambios:
## Generar un certificado SSL autofirmado
### Crear la clave privada y el certificado
Genera una clave privada sin contraseña:
sudo openssl genpkey -algorithm RSA -out /etc/ssl/private/email.ccuellar.test.key
Genera el certificado autofirmado:
sudo openssl req -x509 -new -nodes -key /etc/ssl/private/email.ccuellar.test.key \
-sha256 -days 365 -out /etc/ssl/certs/email.ccuellar.test.crt
<p style="text-align: justify;">
Durante este proceso, se te pedirá ingresar información como el Common Name (FQDN) . Usa <strong>email.ccuellar.test</strong>
## Configurar el VirtualHost para HTTPS (puerto 443)
Edita el archivo de configuración existente:
sudo vi /etc/apache2/sites-available/email.ccuellar.test.conf
Añade la configuración para HTTPS al final del archivo:
<VirtualHost *:80>
ServerName email.ccuellar.test
Redirect permanent / https://email.ccuellar.test/
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin root@ccuellar.test
ServerName email.ccuellar.test
DocumentRoot /var/www/html/email.ccuellar.test
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/email.ccuellar.test.crt
SSLCertificateKeyFile /etc/ssl/private/email.ccuellar.test.key
Protocols h2 http/1.1
<Directory /var/www/html/email.ccuellar.test>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
</IfModule>
## Habilitar los módulos necesarios
Habilita los módulos para SSL y HTTP/2:
sudo a2enmod ssl
sudo a2enmod http2
Verifica la sintaxis de la configuración:
sudo apache2ctl configtest
Reinicia Apache2:
sudo systemctl restart apache2
## Verificar que todo funciona
### Verificar redirección HTTP → HTTPS
<p style="text-align: justify;">
Usa curl para comprobar que las solicitudes HTTP se redirigen correctamente a HTTPS:
curl -I http://email.ccuellar.test
<p style="text-align: justify;">
Deberías ver una respuesta con un código 301 Moved Permanently hacia https://email.ccuellar.test.
### Verificar HTTPS
curl -I https://email.ccuellar.test
Nos mostrará un mensaje:
curl: (60) SSL certificate problem: self-signed certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
<p style="text-align: justify;">
El error SSL certificate problem: self-signed certificate indica que curl no puede verificar la legitimidad del certificado porque no está firmado por una CA confiable. Esto es esperable en entornos de desarrollo o pruebas donde usamos certificados autofirmados.
### Solución
#### Agregar el certificado al almacén de confianza del sistema
<p style="text-align: justify;">
Para evitar este error en herramientas como curl, navegadores web u otros clientes, puedes agregar el certificado autofirmado al almacén de confianza del sistema. Aquí están los pasos:
##### Copiar el certificado al almacén de CA del sistema
<p style="text-align: justify;">
Copia el certificado autofirmado (email.ccuellar.test.crt) al directorio de certificados del sistema:
sudo cp /etc/ssl/certs/email.ccuellar.test.crt /usr/local/share/ca-certificates/
##### Actualizar el almacén de certificados
<p style="text-align: justify;">
Actualiza el almacén de certificados del sistema para que reconozca el nuevo certificado:
sudo update-ca-certificates
<p style="text-align: justify;">
Esto agregará el certificado al almacén de confianza del sistema y permitirá que herramientas como curl y navegadores web confíen en él.
##### Verificar nuevamente con curl
curl -I https://email.ccuellar.test
##### Verificar el certificado
Usa OpenSSL para inspeccionar el certificado:
openssl s_client -connect email.ccuellar.test:443 -servername email.ccuellar.test
## Notas importantes
* Certificado autofirmado : Los navegadores no confiarán automáticamente en este certificado porque no está firmado por una CA reconocida. Para entornos de producción, considera usar Let's Encrypt o una CA comercial.
* Seguridad : Asegúrate de proteger adecuadamente los archivos de clave privada (/etc/ssl/private/email.ccuellar.test.key) y el certificado (/etc/ssl/certs/email.ccuellar.test.crt).
🤗
---
## [Índice de secciones aquí](https://hackmd.io/@ccuellar/rJ73y6FpJe)
## [👈Anterior sección](https://hackmd.io/@ccuellar/SkfRjrwake) 😄 [Siguiente sección 👉](https://hackmd.io/@ccuellar/ryMRcAFT1g)