martes, 8 de abril de 2025

Gitlab(4). Cambio de certificado de servidor. Crear una CA. Certidicados de servidor. Certificados Wildcard de servidor

0. Certificado caducado

Para ver si el certificado está caducado hacemos los siguientes pasos:

  1. Averiguar el dominio y la IP ( en mi caso el dominio es gitlab.municipio.es y la IP 182.168.28.XXX)
  2. Conectarse al servidor por ssh (ssh myuser@182.168.28.XXX), si tenemos una clave SSH no hará falta contraseña, pero sinó, se la da y en paz
  3. Ejecutar (sudo openssl x509 -in /etc/gitlab/ssl/gitlab.municipio.es.crt -noout -dates) donde se marca en otro color el dominio utiliado para el certificado. Nos devolvera las fechas de inicio y fin de validez del certificado
Si el certificado está caducado a veces no deja acceder por https al servidor gitlab, ni tampoco deja hacer un commit desde visual studio.

Por tanto hay que cambiar el certificado,

Pero que pasa si no tenemos un certificado emitido por una entidad certificadora o no queremos utilizar LetsEncrypt

Pues nos creamos una entidad certificadora, creamos el certificado y lo instalamos

1. Creación de una CA (entidad certificadora)

Creamos una carpeta para estos menesteres y ejecutamos dentro de esta carpeta:

# 1. Create a self-signed CA certificate and answer the questions:
#    Enter PEM pass phrase:

openssl genrsa -aes256 -out ca.key 4096
# 2. Create a self-signed CA certificate and answer the questions:
#    Country Name (2 letter code) [AU]: ES
#    State or Province Name (full name) [Some-State]:Valencia
#    Locality Name (eg, city) []:Municipio
#    Organization Name (eg, company) [Internet Widgits Pty Ltd]: Ayto
#    Organizational Unit Name (eg, section) []:Informatica
#    Common Name (e.g. server FQDN or YOUR name) []:XimoDante
#    Email Address []:ximodante@gmail.com

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

Y obtenemos ca.key y ca.crt (clave y certificado de CA autofirmado)

Agregamos el certificado de la CA a los certificdos raiz de confianza

#1. Add the CA certificate to the certificate folder (linux)
sudo cp ca.crt /usr/local/share/ca-certificates/

#2. Update teh certificate collection
sudo update-ca-certificates


2. Creación del certificado de servidor

Creamos un fichero de configuración llamado por ejemplo gitlab_openssl.cnf con este contenido

[ req ]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = req_distinguished_name
req_extensions     = req_ext

[ req_distinguished_name ]
C  = ES
ST = Valencia
L  = Municipio
O  = AytoGitlab
CN = gitlab.municipio.es

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = gitlab.municipio.es

Creamos la clave del servidor y el CRS (Certificate Signing Request). OJO hay que tener en cuenta el SAN que apunta nuestro dominio

# Create a private key and CSR for the server
openssl req -new -nodes \
  -out gitlab.csr \
  -newkey rsa:2048 \
  -keyout gitlab.municipio.es.key \
  -config gitlab_openssl.cnf

Verificamos el contenido del CSR generado:

openssl req -in gitlab.csr -noout -text

Y contesta entre otras cosas el CN y el SAN (X509v3 Subject Alternative Name):

Subject: C = ES, ST = Valencia, L = Municipio, O = AytoGitlab, CN = gitlab.municipio.es
.....
Attributes:
            Requested Extensions:
                X509v3 Subject Alternative Name: 
                    DNS:gitlab.municipio.es
....

Ahora creamos el certificado de servidor 

openssl x509 -req -in gitlab.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-out gitlab.municipio.es.crt -days 365 -sha256


3. Instalación del certificado en gitlab

Ejecutar scp para copiar estos ficheros al servidor

scp ca.crt gitlab.municipio.es.crt gitlab.municipio.es.key myuser@192.168.28.XXX:/etc/gitlab/ssl

Modificamos el fichero /etc/gitlab/gitlab.rb del servidor gitlab de manera qaue tenga estas líneas:

nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.municipio.es.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.municipio.es.key"

Ejecutamos:

#1. Actualizar cambios
sudo gitlab-ctl reconfigure

#2. Recargar gitlab
sudo gitlab-ctl restart


4. Añadir certificado raiz CA al cliente Chrome y Mozilla

Para linux tenenemos:

#!/bin/bash

CERT_FILE="ca.crt"

echo "Intentando añadir el certificado CA a los almacenes de confianza..."

# 1. Añadir al almacén de confianza del sistema (para Chrome y otros navegadores)
if command -v sudo >/dev/null 2>&1; then
  echo "Usando sudo para permisos de administrador."
  sudo cp "$CERT_FILE" /usr/local/share/ca-certificates/
  sudo update-ca-certificates
  if [ $? -eq 0 ]; then
    echo "Certificado CA añadido al almacén de confianza del sistema."
  else
    echo "Error al añadir el certificado CA al almacén de confianza del sistema."
  fi
else
  echo "Se necesitan permisos de administrador (sudo) para añadir al almacén del sistema."
  echo "Por favor, ejecuta este script con sudo."
fi

echo ""
echo "Configuración específica para Mozilla Firefox:"
echo "Mozilla Firefox utiliza su propio almacén de certificados."
echo "No se puede añadir automáticamente un certificado raíz de confianza a través de la línea de comandos de forma sencilla."
echo "El usuario debe importar manualmente el certificado en la configuración de Firefox:"
echo "  - Abrir Firefox."
echo "  - Ir a Preferencias -> Privacidad y seguridad."
echo "  - Bajar hasta la sección 'Certificados' y hacer clic en 'Ver certificados'."
echo "  - Ir a la pestaña 'Autoridades' y hacer clic en 'Importar'."
echo "  - Seleccionar el archivo '$CERT_FILE' y seguir las instrucciones."
echo "  - Asegurarse de marcar la casilla 'Confiar en esta CA para identificar sitios web'."

echo ""
echo "Proceso completado (la adición a Firefox es manual)."

y para windows:

@echo off
echo Intentando añadir el certificado CA a los almacenes de confianza...

set CERT_FILE="ca.crt"

echo.
echo Añadiendo al almacén de autoridades de certificación raíz de confianza (para Chrome y otros navegadores)...
certutil -addstore Root "%CERT_FILE%"
if %errorlevel% == 0 (
    echo Certificado CA añadido al almacén de confianza del sistema.
) else (
    echo Error al añadir el certificado CA al almacén de confianza del sistema (requiere permisos de administrador).
    echo Por favor, ejecuta este script como administrador.
)

echo.
echo Configuración específica para Mozilla Firefox:
echo Mozilla Firefox utiliza su propio almacén de certificados.
echo No se puede añadir automáticamente un certificado raíz de confianza a través de la línea de comandos de forma sencilla.
echo El usuario debe importar manualmente el certificado en la configuración de Firefox:
echo   - Abrir Firefox.
echo   - Ir a Opciones -> Privacidad y seguridad.
echo   - Bajar hasta la sección 'Certificados' y hacer clic en 'Ver certificados...'.
echo   - Ir a la pestaña 'Autoridades' y hacer clic en 'Importar...'.
echo   - Seleccionar el archivo "%CERT_FILE%" y seguir las instrucciones.
echo   - Asegurarse de marcar la casilla 'Confiar en esta CA para identificar sitios web'.

echo.
echo Proceso completado (la adición a Firefox es manual).
pause

En Windows también se puede hacer:

1. Abre el Administrador de certificados

Presiona Win + R, escribe: certmgr.msc

2. Importar el certificado a "Entidades de certificación raíz de confianza", boton derecho, "Todas las tareas", "Importar" y le damos la ruta del certificado raiz CA


2. Cuando te pregunte "Colocar todos los certificados en el siguiente almacén", asegúrate de que esté seleccionado:

3. Reinicia Chrome


5. Crear certificados de servidor wildcard

Si queremos crear certificado de servidor wildcard para los dominios *.municipio.es hacemos:

#1. Crear la clave privada
openssl genrsa -out wildcard.municipio.es.key 2048

#2. Crear el archivo de configuración wildcard.cnf con este contenido
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

[ dn ]
C = ES                   # País (España)
ST = Provincia           # Provincia
L = Ciudad               # Localidad
O = Organización         # Nombre de tu organización
CN = *.municipio.es      # Dominio wildcard

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = *.municipio.es   # Dominio principal wildcard
DNS.2 = municipio.es     # Dominio raíz (opcional)

#3. Generar el CSR (Certificate Signing Request)
openssl req -new -key wildcard.municipio.es.key \
-out wildcard.municipio.es.csr \
-config wildcard.cnf

#4. Generar y firmar el certificado 
openssl x509 -req -in wildcard.municipio.es.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-out wildcard.municipio.es.crt \
-days 365 -sha256 \
-extfile wildcard.cnf -extensions req_ext


#5. Verificar los datos del certificado (Subject: CN y X509v3 Subject Alternative Name: DNS)
openssl x509 -in wildcard.municipio.es.crt -text -noout

Si se quiere instalar en gitlab, hay que cambiar un certrificado por el otro en la carpeta /etc/gitlab/ssl y modificar el fichero del servidor /etc/gitlab/gitlab.rb

No hay comentarios :

Publicar un comentario