miércoles, 29 de agosto de 2012

Como redireccionar para páginas seguras en APACHE (HTTPS)

A veces tenemos un sitio que necesita privacidad entre el servidor y el cliente y para esto necesitamos que sea segura la conexión.

En este ejemplo usaremos apache como servidor web en un servidor de debian squeeze.

A la hora de activar la navegación segura en un virtualhost de apache necesitamos tener un certificado valido y firmado por una CA (Certificate Authority) para que nuestro navegador automaticamente lo reconozca y no de el error de suplantación de identidad que normalmente ofrece cuando estos no están firmados.

En este ejemplo vamos a usar los mismos certificados que trae apache por defecto para el montaje del sitio, en otra entrada hablaremos sobre como crear tu propia CA para autofirmar los certificados que necesites.

Lo primero es habilitar el modulo SSL de esta forma:

server# a2enmod ssl

De estar habilitado mostrara el mensaje "Module ssl already enabled" de lo contrario despues de habilitarlo tendremos que reiniciar el servicio.

server# /etc/init.d/apache2 restart

Ya tenemos el modulo habilitado y lo podemos probar habilitando el virtualhost por defecto que trae nuestro servidor apache de esta forma:

server# a2ensite default-ssl

Despues de esto volvemos a reiniciar el servidor para que cargue la configuración y ya podemos ver el sitio por defecto de forma segura.

Para un nuevo sitio solo necesitamos crear el virtualhost, para esto vamos a copiar el que trae por defecto de esta forma

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/misitio

y editamos la configuración interna con el editor que mas nos guste, yo particularmente uso "nano" para esto.

El contenido sera parecido o igual al siguiente:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />       
                Options FollowSymLinks
                AllowOverride None
        <Directory>

        <Directory /var/www/>

                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        <Directory>


        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        <Directory>


        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

<VirtualHost>

Pero este virtualhost no tiene habilitado el SSL por defecto asi que al modificarlo para el funcionamiento del servidor quedaría de la siguiente forma:

<VirtualHost *:443>
        ServerAdmin webmaster@misitio.com
        ServerName misitio.com
        DocumentRoot /var/www/misitio
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/misitio/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </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

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/misitio-access.log combined
</VirtualHost>



Lo habilitamos para que se muestre en el navegador de la siguiente forma:

server# a2ensite misitio
server# /etc/init.d/apache2 restart 

Ya en este si tenemos habilitado el SSL para que se muestre de forma segura, el único inconveniente es que si un usuario no lo pide de la forma https://misitio.com le mostraría un error el navegador. 

Si quisieramos redireccione automaticamente de http a https la configuración debería ser la siguiente.

Habilitamos el modulo para reescribir URL:

server# a2enmod rewrite

despues de esto reinciamos el servidor apache

server# /etc/init.d/apache2 restart

y modificamos la entrada de nuestro virtualhost para que quede de la siguiente forma:

<VirtualHost *:80>
        ServerAdmin webmaster@misitio.com
        ServerName misitio.com
        DocumentRoot /var/www/misitio
        #Reescribir URL
        RewriteEngine on
        RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=permanent]
</VirtualHost>

<VirtualHost *:443>
        ServerAdmin webmaster@misitio.com
        ServerName misitio.com
        DocumentRoot /var/www/misitio
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/misitio/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </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

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/misitio-access.log combined
</VirtualHost>


Ya con esto nuestro sitio siempre se verá de forma segura aunque los usuarios no lo pidan de esa forma, si tenemos mas de un sitio que use navegación segura en nuestro servidor debemos editar el fichero /etc/apache2/ports.conf para que quede de la siguiente forma:

NameVirtualHost *:80
NameVirtualHost *:443
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>


Así evitamos que cada vez que se pida un sitio por SSL siempre cargue el primero que apache encuentre. Recordar que cada cambio echo en la configuración del servidor se debe recargar nuevamente para que esta tenga efecto.

Después de este ultimo paso ya podemos usar nuestro sitio de forma segura. Espero les sirva y entiendan paso a paso todo.

Saludos,

No hay comentarios: