Certificados autofirmados en Linux

Certificados autofirmados en Linux

Aprovisionar certificado raíz y certificados para web desde Linux con OpenSSL.

Para poder usar HTTPS en sitios web locales (como localhost, o en una red interna) es necesario generar certificados autofirmados. Usar certificados de Let's Encrypt u otras autoridades de certificación no es posible porque los dominios no son públicos.

Equivalente en Windows

  1. Abrir una línea de comandos y tener OpenSSL instalado.

Certificado raíz

Es necesario cambiar los campos days por la cantidad de días que quieres hasta que expire el certificado, y los archivos de salida por los que quieras. También se deben dar interactivamente los datos que pida.

mkdir certificados && cd certificados
openssl req -x509 -nodes -new -sha512 -days 365 -newkey rsa:4096 -keyout ca.key -out ca.pem
openssl x509 -outform pem -in ca.pem -out ca.crt

Certificados por stios

Lo primero es configurar las extensiones del certificado, que incluye los nombres alternativos del sitio web y las finalidades del certificado. Para ello, se crea un archivo v3.ext con el siguiente contenido:

cat > v3.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = prueba1.lan
EOF
openssl req -new -nodes -newkey rsa:4096 -keyout local.key -out local.csr

Generar el primer certificado

El primer certificado se genera con el siguiente comando, cubriendo interactivamente los datos que pida.

$ openssl x509 -req -sha512 -days 365 \
  -extfile v3.ext \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -in local.csr \
  -out local.crt

Generando más certificados

Ya que cada certificado tiene un "núnero de serie", los siugientes certificados no pueden tener el mismo. Para eso está el archivo ca.srl, que se puede incrementar con cada nuevo certificado. Para generar un certificado con esas características, podemos generarlo del siguiente modo.

openssl x509 -req -sha512 -days 365 \
  -extfile v3.ext \
  -CA ca.crt -CAkey ca.key -CAserial ca.srl \
  -in local.csr \
  -out local.crt

Confiar en el certificado

Para que el navegador confíe en el certificado, hay que instalarlo en el sistema. Para ello, se puede usar el siguiente comando.

sudo cp ca.crt /usr/local/share/ca-certificates/mi-ca.crt

Y luego actualizar los certificados con el siguiente comando.

sudo update-ca-certificates

Usar el certificado en NGINX

Lo primero es copiar el certificado y la clave privada al directorio de configuración de NGINX.

sudo cp local.crt /etc/nginx/ssl/local.crt
sudo cp local.key /etc/nginx/ssl/local.key

Para usar el certificado en NGINX, se debe configurar el sitio web con el siguiente contenido.

server {
  listen 443 ssl;
  server_name prueba1.lan;

  ssl_certificate /etc/nginx/certificados/local.crt;
  ssl_certificate_key /etc/nginx/certificados/local.key;

  location / {
    root /var/www/html;
  }
}