Skip to main content

Crear certificado para Webserver

Si tiene la necesidad de crear un certificado con la PKI para una web interna. Suponiendo que el dominio de la web va a ser test.psc.local.

Generar CSR y KEY

Si el equipo IT de otra ciudad nos solicita un certificado, lo ideal sería que ellos generaran la request (quedando en sus manos la clave privada) y enviando unicamente el CSR.

Para generar el certificado, deben usar el siguiente comando (teniendo en cuenta los que valores del campo Subj)

openssl req -nodes -new -newkey rsa:4096 \
	-keyout test.psc.local.key \
    -out test.psc.local.csr \
    -addext "subjectAltName = DNS:test.psc.local" \
    -subj "/C=ES/ST=Barcelona/L=Barcelona/O=GRG-CA/OU=GRG-CA/emailAddress=your@email.dot/CN=test.psc.local/"

Firmar con la SUBCA

Usted como administrador ha recibido una fichero CSR y debe firmarlo para poder generar el certificado y enviarselo al equipo IT.

Suponiendo que el certificado lo ha subido al servidor SubCA a la ruta /root/test.psc.local.csr debe ejecutar el siguiente comando. Consulte con el que le ha enviado los días de validez que ha de tener el certificado, teniendo en cuenta las limitaciones que imponen navegadores como Chrome respecto a el tiempo de validez.

cd /root/ca
openssl ca -config intermediate/sub-ca-openssl.cnf \
    -extensions server_cert \
    -days 375 -notext -md sha512 \
    -in /root/test.psc.local.csr \
    -out /root/test.psc.local.crt

Validar firma y certificado

Una vez ha sido firmado, puede consultar en el archivo /root/ca/intermediate/subordinate-ca-database.txt que ha quedado registrada la firma.

A continuación valide que el certificado tiene los datos correctamente configurados

openssl x509 -noout -text -in test.psc.local.crt

Debería ver los siguientes datos

Atributo Datos
Issuer Firmado por la SubCA
Subject Datos propios del certificado
CA False (No se podrá usar para firmar peticiones de certificados)

Verifique la cadena de certificación con el comando, debería devolver como resultado OK

openssl verify -CAfile full-chain.pem test.psc.local.crt

Para ello deberá añadir al certificado la full-chain (Subca + RootCA).

cat test.psc.local.crt sub-ca.crt root-ca.crt > test.psc.local.fullchain.crt

Si ejecuta un cat test.psc.local.fullchain.crt | grep BEGIN deberían aparecer 3.

Copie el fichero fullchain y envieselo al solicitante. Si ha generado usted todo el certificado, envie el fichero .key por otro método y con una contraseña para que solo el solicitante pueda abrirlo.

Instalar Certificado en Nginx

server {
	# Redireccion de HTTP (80) -> HTTPS (443)
    if ($host = test.psc.local) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    server_name test.psc.local;
    return 404; 
}
server {
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name tests.psc.local;

        location / {
                try_files $uri $uri/ =404;
        }
        listen 443 ssl; 
        
        # Clave privada que se ha generado junto con el CSR
        ssl_certificate_key /etc/nginx/certs/test3.psc.local.key;
		# Certificado firmado por la Entidad Certificadora (subca)
        ssl_certificate /etc/nginx/certs/test3.psc.local.fullchain.pem;

Ahora desde un equipo que ya tenga la RootCA navegue hacia la web en la que ha instalado el certificado y si ha realizado correctamente todos los pasos, deberá ver que no salta el error de certificado autofirmado.

Convertir a formato PFX

Los servidores Web IIS de Microsoft solo admiten el formato PFX. Puede convertir el .key y el .crt a dicho formato haciendo uso del siguiente comando.

openssl pkcs12 -export \
	-out test.psc.local.pfx \
	-inkey test.psc.local.key \
	-in test.psc.local.crt 

CRL y navegadores actuales

Los navegadores actuales ya no hacen uso de las CRL para detectar si un certificado ha sido revocado. En el caso de Chrome / Edge hacen uso algo llamado CRLSet que controlan ellos

Script para crear varios certificados

Si tiene que crear varios CSR y claves (que luego al firmarlas se convertiran en certificados) de golpe, puede usar el siguiente script.

services=("firewall webcheck pihole xoa openvas ha portainer portal docs")

for service in ${services[@]}; do
	openssl req -nodes -new -newkey rsa:4096 \
		-keyout $service.psc.lan.key \
		-out $service.psc.lan.csr \
		-addext "subjectAltName = DNS:$service.psc.lan" \
		-subj "/C=ES/ST=Barcelona/L=Barcelona/O=GRG-ROOT-CA-2023/OU=GRG-ROOT-CA-2023/emailAddress=your@email.dot/CN=$service.psc.lan/"
done;

Luego deberá firmarlos