SSL para servidores virtuales.

SSL para servidores virtuales.

Configurar Apache para usar SSL (acceso HTTPS)

No basta con crear configuraciones SSL para el servidor virtual. Apache debe cargar el módulo SSL, lo que podemos hacer con el comando a2enmod:

# sudo a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
systemctl restart apache2

Y como nos indica el propio comando, debemos reiniciar Apache:

# sudo systemctl reload apache2

Ya podemos acceder a la página web de nuestro servidor virtual tanto a través de HTTP, en la dirección http://vhost1.net, como a través de HTTPS, en la dirección https://vhost1.net.

Seguramente el navegador presentará una alerta por comprobar que el certificado no está firmado por autoridades certificadoras, pero aceptando (donde proceda, según el navegador), se presentará la página cifrada sin más problemas.

Configurando SSL para un dominio real

En el ejemplo de este tutorial estamos usando un dominio local para el servidor virtual, pero si te interesa un dominio de Internet entonces querrás usar un certificado firmado por alguna autoridad certificadora.

Suponiendo que ya tienes todo configurado y los certificados instalados en tu sistema, las directivas SSL del archivo de configuración serían algo así:

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/tudominio.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tudominio.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/tudominio.com/chain.pem

En este ejemplo tenemos instalados los certificados generados por la autoridad certificadora Let’s Encrypt para el dominio tudominio.com.

La configuración es muy similar, únicamente hay que añadir una directiva SSLCertificateChainFile para indicar el arhivo chain que verifica que el certificado está firmado por la autoridad certificadora (Let’s Encrypt en este caso).

Simplificando el archivo de configuración para el servidor virtual

Hasta ahora hemos configurado el servidor virtual vhost1.local con configuraciones idénticas para HTTP y HTTPS. Podríamos ofrecer páginas distintas si se accede mediante uno u otro protocolo, bastaría con especificar en la configuración distintas carpetas de documentos web. Pero lo habitual hoy día es no sólo ofrecer el mismo contenido, sino ofrecerlo únicamente vía HTTPS.

El archivo de configuración completo ha quedado así:

<VirtualHost *:80>
 ServerName vhost1.net
 ServerAlias www.vhost1.net
 DocumentRoot /home/henry/public_html/vhost1
 <Directory /home/henry/public_html/vhost1>
           Options -Indexes
           AllowOverride all
           Require all granted
 </Directory>
 ErrorLog ${APACHE_LOG_DIR}/vhost1.net-error.log
 CustomLog ${APACHE_LOG_DIR}/vhost1.net-access.log combined
 LogLevel info

</VirtualHost>
<VirtualHost *:443>
ServerName vhost1.net
 ServerAlias www.vhost1.net
 DocumentRoot /home/henry/public_html/vhost1
 <Directory /home/henry/public_html/vhost1>
            Options -Indexes
            AllowOverride all
            Require all granted
 </Directory>
 SSLEngine on
 SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 LogLevel info ssl:warn

</VirtualHost>

Para ofrecer todo el contenido cifrado modificaremos el archivo para dejarlo así:

<VirtualHost *:80>
 ServerName vhost1.local
 ServerAlias www.vhost1.local
 Redirect permanent / https://vhost1.local/
 ErrorLog ${APACHE_LOG_DIR}/vhost1.local-error.log
 CustomLog ${APACHE_LOG_DIR}/vhost1.local-access.log combined
 LogLevel info
</VirtualHost>

<VirtualHost *:443>
 ServerName vhost1.net
 ServerAlias www.vhost1.net
 DocumentRoot /home/henry/public_html/vhost1
 <Directory /home/henry/public_html/vhost1>
           Options -Indexes
           AllowOverride all
           Require all granted
</Directory>
 SSLEngine on
 SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 LogLevel info ssl:warn
</VirtualHost>

Hay que mantener las directivas para los nombres de dominio y la configuración de archivos de registro, pero eliminamos la directiva DocumentRoot y el bloque Directory, sustituyéndolos por esta directiva Redirect:

Redirect permanent / https://vhost1.local

De esta forma, todas las peticiones HTTP se redirigirán a sus versiones HTTPS.

Configuracion pare servidores virtuales en una red local (probado)

Habilitamos el módulo SSL del apache

# ssl sudo a2enmod ssl

Una vez habilitado del módulo SSL, debemos empezar a generar nuetro certificado de seguridad, empezamos generando la llave (KEY) mediante el uso de la aplicacion openssl; que previamente debería estar instalada (# sudo apt install openssl):

# sudo openssl genrsa -des3 -out server.key 2048

Creamos el archivos CSR

# sudo openssl req -new -key server.key -out server.csr

Ahora debemos encapsular con la llave anterior el certificado

# sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Si hacemos un listado de los archivos generados tendremos:

Copiamos el certificado generado a la carpeta de apache

# sudo cp server.crt /etc/ssl/certs/

Copiamos la llave a la carpeta de certificados ssl en private

# sudo cp server.key /etc/ssl/private/

Modificamos el archivo de configuracion de nuestro sitio al que agregaremos el certificado, para eso nos dirigimos a:

# cd /etc/apache2/sites-available

Desde este directorio editamos el archivo de configuracion del sitio que habíamos creado anteriormente denomionado vhost1

# sudo nano vhost1.net.conf

y agregamos o localizamos las isguientes entradas:

Cambio el puerto a 443

<VirtualHost *:443>

Luego agrego

SSLEngine on
SSLCertificateKeyFile /etc/ssl/private/server.key
SSLCertificateFile /etc/ssl/certs/server.crt

Luego :

# sudo a2ensite vhost1.net.conf

Y reiniciamos el apache

# sudo systemctl reload apache2

Ahora podemos probar con el navegador observaremos que antes no habia un certificado

Y una vez activado el certificado y reiniciado el servodor web apache, observaremos que se puede navegar con protocolo de seguridad:

Listo..! esta funcionando.

You must be logged in to post a comment