HTTPS, "Mixed Content" y mi propia web personal

Aunque no tan rápido como algunos quisiéramos, HTTPS se está popularizando. Por el bien de todos. Yo actualicé mis propias webs en noviembre de 2014 como describo en mi artículo ¡Cifrad, cifrad, malditos!.

Además de la privacidad y la seguridad, cada vez hay más incentivos para migrar a HTTPS. Por ejemplo, hoy en día la navegación HTTPS puede ser más rápida que a través de HTTP normal y corriente. Comento algo al respecto en el artículo HTTP/2 ha llegado y aquí lo tienes funcionando.

A pesar de ello, el uso de HTTPS sigue siendo minoritario. Hay muchos motivos por los que una web no migra a HTTPS, la mayoría triviales y algunos graves y complicados. Un motivo frecuente, sobre todo en webs con publicidad [1], es lo que se llama Mixed Content.

La explicación simple de Mixed Content es la siguiente: para que una web sea segura no basta con que se sirva a través de HTTPS, sino que todos los objetos que esta página carga deben ser referenciados a través de HTTPS también. Por ejemplo, una web no es segura si se descarga por HTTPS, pero hace referencia a código Javascript que se descarga por HTTP.

Si una página web segura (HTTPS) carga objetos a través de HTTP, estaremos mezclando contenido seguro y no seguro. Es decir, tenemos un problema de Mixed Content. Los navegadores suelen mostrar este hecho en la barra de direcciones. Por ejemplo, en Firefox nos saldrá algo de este estilo:

mixed_1.png

En Firefox aparece un triángulo de aviso, aunque el mensaje en sí no es consistente con el problema.

Investigando el contenido de mi propia página web, veo que estoy cargando tres imágenes desde servidores HTTP. Probando, veo que los tres servidores web, en el año transcurrido, han migrado a HTTPS también. Perfecto. Cambio las URLs [2] [3] de las imágenes en mi web y ahora veo lo siguiente:

mixed_2.png

El triángulo de aviso se ha convertido en un candado indicando una conexión HTTPS segura.

Misión cumplida.

[1] Si una web HTTPS incluye publicidad que solo está disponible a través de HTTP, cosa muy habitual hasta hace bien poco, tendría el mismo problema. Es decir, una web que depende de la publicidad no puede migrar a HTTPS hasta que lo hace la red publicitaria de la que depende. Que una red publicitaria con muchos millones de accesos al día migre a HTTPS no es trivial, sobre todo si depende de una CDN de terceros.
[2]

Los cambios en mi web han sido los siguientes:

  • En la cabecera de la página:

    - <a href="http://internetdefenseleague.org"><img src="http://internetdefenseleague.org/images/badges/final/side_bar_badge.png" alt="Member of The Internet Defense League" /></a>
    + <a href="https://internetdefenseleague.org"><img src="https://internetdefenseleague.org/images/badges/final/side_bar_badge.png" alt="Member of The Internet Defense League" /></a>
    
    [...]
    
    - <a href="http://es.wikipedia.org/wiki/Geocaching"><img src="http://img.geocaching.com/stats/img.aspx?uid=6c9b2a99-0c9e-4324-9068-4e2e8921c511&txt=Estad%C3%ADsticas+de+Geocaching" border="0" alt="Geocaching" title="Geocaching"></a>
    + <a href="https://es.wikipedia.org/wiki/Geocaching"><img src="https://img.geocaching.com/stats/img.aspx?uid=6c9b2a99-0c9e-4324-9068-4e2e8921c511&txt=Estad%C3%ADsticas+de+Geocaching" border="0" alt="Geocaching" title="Geocaching"></a>
    
  • En el pie de página:

    - <a href="http://www.python.org/" title="Python">
    - <img src="http://www.python.org/images/python-logo.gif"
    + <a href="https://www.python.org/" title="Python">
    + <img src="https://www.python.org/images/python-logo.gif"
    
[3] Como puede verse, simplemente he cambiado los http:// a https://. Esto ha sido posible, claro, porque los servidores originales han migrado, a su vez, a HTTPS. Si no fuese así, podría haber copiado las imágenes a mi propio servidor web (para así servirlas por HTTPS). El único problema hubiera sido la web de geocaching, ya que el gráfico que se muestra en el navegador se genera de forma dinámica en cada petición. Nada que no se pueda solucionar refrescando la versión local con un cron o alguna técnica similar. Afortunadamente, no ha sido necesario.