---
# System prepended metadata

title: Apache2 y certificado SSL autofirmado

---

[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)
