[PyVigo] Reactivación de HPKP en python-vigo.es

Luis González Fernández luisgf at luisgf.es
Thu Feb 18 14:35:40 CET 2016


Hola a todos:

Con la migración de los certificados que opero hacia let's encrypt han aparecido una serie de inconvenientes que degradan la configuración SSL y por consiguiente la seguridad de la transmisión.

Todos mis sistemas emitian las cabeceras necesarias para soportar HSTS (HTTP Strict Transport Security) y HPKP (Public Key Pinning Extension for HTTP).

Para los neófitos la siguiente explicación rápida:
HSTS: Es un mecanismo por el cual el servidor web le indica a un navegador que las peticiones que realicen a un determinado sitio, deben ir siempre a través de HTTPS.

HPKP: Es un mecanismo que informa al navegador de los certificados autorizados que puede ver a la hora de conectarse a un sitio. Si vé otros certificados, podriamos ser victimas de un ataque tipo Man-in-the-middle, asi que impedirá tal conexion.


Con los certificados tradicionales, esto no suponia demasiado problema ya que su duración es elevada (1 o 2 años), lo cual me permitia generar pins con una duración un poco inferior a la caducidad de los certificados y darme un margn de maniobra amplio para renovarlos y generar los nuevos pins. 

El problema surje con let's encrypt (servicio fantástico!!!) ya que la duración de sus certificados actualmente es de 3 meses y en un futuro podría incluso reducirse.

Asi pues, para lidiar con la problematica he desarrollado un pequeño programa en Perl, (vaaaale es broma), en Python 3.5 que genera los pins HPKP de forma automática. El siguiente programa se ejecutará justo despues de la renovación del certificado y generará un PIN con una duración no superior a la del certificado con respecto a la fecha actual. Esto impedirá crear un pin que tenga validez una vez el certificado haya expirado.

La idea detrás de esto es que este programa se ejecute como hook o plugin del cliente let's encrypt, no obstante y mientras esté en periodo de pruebas, vivirá como un programa independiente.


Configuración de Apache:
<IfModule mpm_itk_module>
        AssignUserID pyvigo pyvigo
</IfModule>

<IfModule mod_ssl.c>
    SSLUseStapling on
    SSLStaplingCache shmcb:/tmp/ocsp_stapling(512000)

    <VirtualHost *:443>
        ServerName www.python-vigo.es
        ServerAlias python-vigo.es
        DocumentRoot /datos/webs/python-vigo
        ErrorLog ${APACHE_LOG_DIR}/www.python-vigo.es_error.log
        CustomLog ${APACHE_LOG_DIR}/www.python-vigo.es_access.log combined

        # Configuracion SSL
        SSLEngine on
        SSLCompression Off
        SSLProtocol all -SSLv2 -SSLv3
        SSLHonorCipherOrder On
        SSLCipherSuite EECDH+AES:ECDHE+ECDSA:ECDHE+RSA:ECDHE+AES:DHE+RSA:ECDH+AES:DHE+AES:EDH+AES:-SHA1:DHE+AES:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5
        SSLCertificateFile /etc/letsencrypt/live/luisgf.es-0001/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/luisgf.es-0001/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/luisgf.es-0001/chain.pem

        # Activamos HSTS
        Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains"
        # Activamos HPKP leyendo la directiva generada por hpkp-python
        Include /etc/apache2/conf-available/hpkp-pin_python-vigo.es.conf

        # http://stackoverflow.com/questions/17092154/x-frame-options-on-apache
        Header set X-Frame-Options SAMEORIGIN
        # http://stackoverflow.com/questions/9090577/what-is-the-http-header-x-xss-protection
        Header set X-XSS-Protection "1; mode=block"
    </VirtualHost>
</IfModule>

Genero el pin con:
./hpkp.py -f /etc/letsencrypt/live/www.python-vigo.es/cert.pem -u http://www.luisgf.es/hpkp_report -d > /etc/apache2/conf-available/hpkp-pin_python-vigo.es.conf

Ya sólo queda reiniciar el apache para que tenga en cuenta los cambios.


Más información:
HPKP-Python: https://github.com/luisgf/hpkp-python
HSTS: http://tools.ietf.org/html/rfc6797
HPKP: https://tools.ietf.org/html/rfc7469


Un Saludo, 

--
Luis González Fernández
https://www.luisgf.es
PGP ID: C918B80F (DD6F BFC1 FC14 4C81 34F8 EA1E 6BCB C27F C918 B80F)
Twitter: @luisgf_2001 / Jabber: luisgf at mijabber.es



More information about the Vigo mailing list