Comienza el lento declive del algoritmo SHA-1

Hace tiempo que se trató en el blog el tema de los algoritmos MD5, SHA-1, SHA-2… Tras conocerse recientemente la primera colisión de hash del algoritmo SHA-1, éste ya está en el punto de mira y tenemos que comenzar a plantearnos el cambio a algoritmos más seguros como SHA-2.

En un primer momento y para los que administréis un frontal web, el primer punto revisar es los certificados que tengáis instalados para servir recursos por HTTPS. Se tendrán que sustituir aquellos certificados en SHA-1 por otros con algoritmo mínimo SHA-2. Por ejemplo, en el caso de los dos principales servidores web que ocupan mayoritariamente el mercado los certificados vienen especificados en las directivas correspondientes:

  • Nginx (ssl_certificate)
    ...
    ssl on;
    ssl_certificate /etc/ssl/certificado.crt; 
    ssl_certificate_key /etc/ssl/clave-privada.key;
    ...
    
  • Apache (SSLCertificateFile)
    ...
    SSLEngine on
    SSLCertificateFile /etc/ssl/certificado.crt
    SSLCertificateKeyFile /etc/ssl/clave-privada.key
    ...
    

Esto ya nos da una pista sobre lo que tenemos que revisar.

Para este caso que nos ocupa, recordemos que el proceso de generación de certificado sigue tres pasos bien definidos:

  1. Generar clave privada.
  2. Generar CSR a partir de la clave privada.
  3. Firmar el CSR y generar el certificado (el proceso de firma lo realiza una CA de confianza normalmente).

Generación de certificado autofirmado

Si generamos un certificado autofirmado los tres puntos anteriores se reducen a una operativa. Procederemos de la siguiente manera:

openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout clave-privada.key -out certificado.crt

Esto generará un fichero clave-privada.key que como su nombre indica contendrá la clave privada y por otro lado tendremos el certificado.crt con su correspondiente clave pública. Según nuestro frontal web, pondremos cada fichero donde corresponda.

Generación de CSR y firma por CA

Otra casuística que se nos puede presentar es que seamos nosotros quienes iniciemos el proceso de generación de certificado desde el principio. Si es desde el punto 1, tendremos que generar la clave privada:

openssl genrsa -out clave-privada.key 2048 

Tanto si ya teníamos la clave privada o la hemos generado nueva en el paso anterior, tendremos que enviar un request de certificado (CSR, Certificate Siging Request) a una CA para la generación de un nuevo certificado, podemos especificar el algoritmo de cifrado con la opción -sha256 en el propio paso de creación del CSR:

openssl req -out request.csr -key clave-privada.key -new -sha256

El certificado que nos envíe de vuelta la CA debería venir firmado ya con SHA-256. Podemos comprobar con openssl el algoritmo de firma del certificado:

openssl x509 -noout -text -in certificado.crt

A modo de ejemplo:

Si todo pinta bien, ya tendremos instalado nuestro nuevo certificado firmado con algoritmo SHA-256.