Certificados digitales. HTTPS

Certificado digital de persona física

certificado

Un certificado digital es un documento electrónico que contiene información sobre la identidad de una persona física o jurídica, y que se utiliza para firmar documentos electrónicos. El certificado digital contiene información sobre la persona que lo solicita, como su nombre, apellidos, DNI, fecha de nacimiento, etc. Además, contiene información sobre la entidad que lo emite, como el nombre de la entidad, el CIF, la dirección, etc.

Tarea 1: Instalación del certificado

NOTA: Para solicitar el certificado, podemos hacerlo a través de una acreditación presencial en una oficina de la FNMT o usando el DNI electrónico.

  1. Una vez que hayas obtenido tu certificado, explica brevemente como se instala en tu navegador favorito.

    • Instalamos el certificado en el navegador. Para ello, accedemos a la página de la FNMT y descargamos el certificado. Nos pedirá nuestro DNI, nuestro primer apellido y un código de validación que nos han mandado a nuestro correo, con el que hemos solicitado el certificado. Una vez descargado, lo instalamos en el navegador.

      1

    • A continuación, tras aceptar los términos y condiciones, nos pedirá que introduzcamos la contraseña que hemos establecido al solicitar el certificado. Una vez introducida, nos pedirá que introduzcamos la contraseña de nuestro certificado para poder instalarlo.

      2

    • Tras la descarga, nos preguntará si queremos crear una copia de seguridad del certificado.

      3

    • Finalmente, nos confirmará que la copia de seguridad se ha realizado correctamente.

      4

  2. Muestra una captura de pantalla donde se vea las preferencias del navegador donde se ve instalado tu certificado.

    • Para ver las preferencias del navegador, accedemos a Ajustes > Privacidad y Seguridad > Certificados > Ver Certificados. Se abrirá una ventana con todos los certificados instalados en nuestro navegador. En ella, podemos ver el certificado que hemos instalado.

    5

  3. ¿Cómo puedes hacer una copia de tu certificado?¿Como vas a realizar la copia de seguridad de tu certificado?. Razona la respuesta.

    • Para hacer una copia de seguridad de nuestro certificado, debemos dirigirnos a Ajustes > Privacidad y Seguridad > Certificados > Ver Certificados. Se nos abrirá la misma ventana de la imagen anterior. Clicamos en el certificado que queremos hacer una copia de seguridad y pulsamos en “Hacer copia”. Se nos abrirá una ventana en la que nos pedirá que introduzcamos la contraseña de nuestro certificado. Una vez introducida, nos pedirá que introduzcamos una contraseña para proteger nuestra copia de seguridad. Finalmente, tendremos nuestra copia de seguridad.

    En mi caso, he almacenado mi clave en un NAS privado, en un directorio cifrado con clave alfanumérica. De esta forma, si alguien accede a mi NAS, no podrá acceder a mi clave privada, ya que no conoce la clave de cifrado.

    6

  4. Investiga como exportar la clave pública de tu certificado.

    • Con la copia de seguridad que tenemos de nuestra clave, y en mi caso, teniendo acceso a mi NAS, tanto en local como por VPN, puedo exportar mi clave a otros dispositivos. En mi caso, he exportado mi clave a mi móvil, (teniedo este sistema operativo iOS).

    • Para la comprobación, he instalado la aplicación de la DGT y poder tener mi documentación en mi dispositivo móvil.

Tarea 2: Validación del certificado

  1. Instala en tu ordenador el software autofirma y desde la página de VALIDe valida tu certificado. Muestra capturas de pantalla donde se comprueba la validación.

    • Para instalar autofirma, debemos dirigirnos a la página de autofirma y descargar el instalador. Una vez descargado, lo instalamos en nuestro ordenador.

    • Una vez instalado, abrimos la aplicación y nos pedirá que introduzcamos la contraseña de nuestro certificado. Una vez introducida, nos pedirá que introduzcamos la contraseña de nuestro certificado para poder instalarlo.

    • Ingresamos en la página de VALIDe y seleccionamos la opción de Validar Certificado

      7

    • Al ser la primera vez, autorizamos a autofirma a acceder a nuestra clave privada.

      8

    • Elegimos la clave que queremos validar, escribimos el captcha y pulsamos en Validar

      9

    • Como podemos ver, la clave es válida.

      10

Preparando el entorno de trabajo en Debian

Como anteriormente he realizado los ejercicios en Windows, a partir de ahora vamos a realizarlo desde Debian. Para ello, sudo apt install libnss3-tools para instalar Java y las herramientas de Mozilla. Una vez instalado, ejecutamos el fichero .deb de autofirma y nos pedirá que introduzcamos la contraseña de nuestro certificado. Una vez introducida, nos pedirá que introduzcamos la contraseña de nuestro certificado para poder instalarlo.

Tarea 3: Firma electrónica

1 Utilizando la página VALIDe y el programa autofirma, firma un documento con tu certificado y envíalo por correo a un compañero.

  • Creamos dos documentos de texto: uno para la comprobación de la página VALIDe y otro para la aplicación de autofirma.
        echo "Hola. Soy Maria. Esto es una prueba de VALIDe." > valide.txt
        echo "Hola. Soy Maria. Esto es una prueba de autofirma." > autofirma.txt
        
  • Una vez creados los documentos, los firmamos, uno con VALIDe y otro con autofirma.

    11

    12

2 Tu debes recibir otro documento firmado por un compañero y utilizando las herramientas anteriores debes visualizar la firma Visualizar Firma y Verificar Firma.

  • ¿Puedes verificar la firma aunque no tengas la clave pública de tu compañero? - Si,debido a que la clave pública de mi compañero se adjunta en el fichero ya firmado, por lo que puedo verificar la firma.

  • ¿Es necesario estar conectado a internet para hacer la validación de la firma?. Razona tus respuestas.

Para VALIDe si que es necesario estar conectado a internet, ya que es una página web. Para autofirma, no es necesario estar conectado a internet, ya que es una aplicación que se ejecuta en nuestro ordenador.

3 Entre dos compañeros, firmar los dos un documento, verificar la firma para comprobar que está firmado por los dos.

13

14

Tarea 4: Autenticación

  1. Utilizando tu certificado accede a alguna página de la administración pública (cita médica, becas, puntos del carnet,…). Entrega capturas de pantalla donde se demuestre el acceso a ellas.

    • Accedemos a la web de la DGT para verificar el funcionamiento de nuestro certificado digital accediendo a nuestro historial de puntos.

      dgt

    • Nos redigirá a una página donde podremos elegir entre los distintos tipos de acceso y elegimos Cl@ave.

      dgt2

    • El navegador, en mi caso, requiere de la aplicación de autofirma para poder acceder a la contraseña. Una vez introducida, nos redirige a la página de la DGT donde podemos ver nuestro historial de puntos.

      dgt3

HTTPS / SSL

https

NOTA: Vamos a realizar esta práctica en una web que se acceda con el nombre maria.iesgn.org.

Para realizar esta tarea, vamos a necesitar la colaboración de un compañero, ya que fimraré una Autoridad Certificadora y mi compañero la firmará, y viceversa.

Para ello, podemos hacer uso de los siguientes enlaces para buscar más información:

Creamos la Autoridad certificadora

Crear su autoridad certificadora (generar el certificado digital de la CA). Mostrar el fichero de configuración de la AC.

  • Creamos el directorio donde alojaremos todo lo necesario para la CA, dándole los permisos necesarios.
        mkdir CA
        cd CA
        mkdir certs csr crl newcerts private 
        chmod 700 private
        touch index.txt
        touch index.txt.attr
        echo 1000 > serial
        
  • Creamos las variables de entorno donde definiremos los datos de configuración de la CA.
    countryName_default="ES"
    stateOrProvinceName_default="Sevilla"
    localityName_default="Dos Hermanas"
    organizationName_default="Maria"
    organizationalUnitName_default="ASIR2"
    emailAddress_default="mariajesus.alloza@outlook.es"
    DIR_CA="./"
    
  • Creamos el fichero de configuración.
    cat <<EOF>$DIR_CA/openssl.conf
    [ ca ]
    # man ca
    default_ca = CA_default

    [ CA_default ]
    # Directory and file locations.
    dir               = ${DIR_CA}
    certs             = ${DIR_CA}certs
    crl_dir           = ${DIR_CA}crl
    new_certs_dir     = ${DIR_CA}newcerts
    database          = ${DIR_CA}index.txt
    serial            = ${DIR_CA}serial
    RANDFILE          = ${DIR_CA}private/.rand

    # The root key and root certificate.
    private_key       = ${DIR_CA}private/private.key
    certificate       = ${DIR_CA}certs/cacert.crt

    # For certificate revocation lists.
    crlnumber         = ${DIR_CA}crlnumber
    crl               = ${DIR_CA}crl/ca.crl.pem
    crl_extensions    = crl_ext
    default_crl_days  = 30

    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md        = sha256

    name_opt          = ca_default
    cert_opt          = ca_default
    default_days      = 375
    preserve          = no
    policy            = policy_strict

    [ policy_strict ]
    # The root CA should only sign intermediate certificates that match.
    # See the POLICY FORMAT section of man ca.
    countryName             = match
    stateOrProvinceName     = match
    organizationName        = match
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional

    [ policy_loose ]
    # Allow the intermediate CA to sign a more diverse range of certificates.
    # See the POLICY FORMAT section of the ca man page.
    countryName             = optional
    stateOrProvinceName     = optional
    localityName            = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional

    [ req ]
    # Options for the req tool (man req).
    default_bits        = 2048
    distinguished_name  = req_distinguished_name
    string_mask         = utf8only
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md          = sha256
    # Extension to add when the -x509 option is used.
    x509_extensions     = v3_ca
    # Extension for SANs
    req_extensions      = v3_req

    [ v3_req ]
    # Extensions to add to a certificate request
    # Before invoke openssl use: export SAN=DNS:value1,DNS:value2
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    xxxsubjectAltNamexxx =

    [ req_distinguished_name ]
    # See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
    countryName                     = Country Name (2 letter code)
    stateOrProvinceName             = State or Province Name
    localityName                    = Locality Name
    0.organizationName              = Organization Name
    organizationalUnitName          = Organizational Unit Name
    commonName                      = Common Name
    emailAddress                    = Email Address

    # Optionally, specify some defaults.
    countryName_default             = $countryName_default
    stateOrProvinceName_default     = $stateOrProvinceName_default
    localityName_default            = $localityName_default
    0.organizationName_default      = $organizationName_default
    organizationalUnitName_default  = $organizationalUnitName_default
    emailAddress_default            = $emailAddress_default

    [ v3_ca ]
    # Extensions for a typical CA (man x509v3_config).
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign

    [ v3_intermediate_ca ]
    # Extensions for a typical intermediate CA (man x509v3_config).
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true, pathlen:0
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign

    [ usr_cert ]
    # Extensions for client certificates (man x509v3_config).
    basicConstraints = CA:FALSE
    nsCertType = client, email
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth, emailProtection

    [ server_cert ]
    # Extensions for server certificates (man x509v3_config).
    basicConstraints = CA:FALSE
    nsCertType = server
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth

    [ crl_ext ]
    # Extension for CRLs (man x509v3_config).
    authorityKeyIdentifier=keyid:always

    [ ocsp ]
    # Extension for OCSP signing certificates (man ocsp).
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, digitalSignature
    extendedKeyUsage = critical, OCSPSigning
    EOF
    
  • Creamos tanto la clave como el certificado de a AC (autoridad de certificación) con el siguiente comando:
    #Creación de la clave

    openssl genrsa -aes256 -out private/private.key 4096
    sed -i 's|xxxsubjectAltNamexxx =|subjectAltName = ${ENV::SAN}|g' openssl.conf
    URL=juanjesus.iesgn.org
    export SAN=DNS:$URL
        
    #Creación del certificado

    openssl req -config openssl.conf -key private/private.key -new -x509 -days 3650 -sha256 -extensions v3_ca -out certs/cacert.crt
    chmod 444 certs/cacert.crt
    
    
  • Debe recibir el fichero CSR (Solicitud de Firmar un Certificado) de su compañero, debe firmarlo y enviar el certificado generado a su compañero.

  • Mi compañero me envía mir fichero CSR, lo firmo y lo envío de vuelta.

    #Firmar el certificado

    openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/juanjesus-mjca.csr -out certs/juanjesus-mjca.crt
    
  • ¿Qué otra información debes aportar a tu compañero para que éste configure de forma adecuada su servidor web con el certificado generado?

    • Dentro de nuestro fichero openssl.conf nos encontraremos con los datos que nuestro compañero debe rellenar para configurar su servidor web, que son:
      • countryName
      • stateOrProvinceName
      • localityName

Administramos el servidor web

Preparando el escenario

Para realizar este punto, deberemos crear un servidor apache, y configurarlo para que nos sirva una página web con https. Para ello, deberemos seguir los siguientes pasos:

  • Instalamos el servidor apache:
    sudo apt install apache2
    
  • Deshabilitamos el virtual host por defecto:
    sudo a2dissite 000-default.conf
    
  • Creamos un nuevo virtual host y su fichero de configuración:
    sudo mkdir /var/www/html/maria.iesgn.org
    
  • Creamos el fichero index.html dentro de la carpeta que hemos creado anteriormente:
    sudo nano /var/www/html/maria.iesgn.org/index.html
    
  • Y dentro de este fichero, escribimos lo siguiente:
        <!DOCTYPE html>
            <html>
                <head>
                <title>maria.iesgn.org</title>
                </head>
            <body>
                <h1>maria.iesgn.org</h1>
                <p>Web de prueba para cripto 3 - HTTPS</p>
            </body>
        </html>
        
  • Habilitamos el nuevo virtual host y reiniciamos el servicio apache:
    sudo a2ensite maria.iesgn.org.conf
    sudo systemctl restart apache2
    

Empezamos

  • Crea una clave privada RSA de 4096 bits para identificar el servidor.
    sudo openssl genrsa -aes256 -out /etc/ssl/private/maria-priv.key 4096
    sudo chmod 400 /etc/ssl/private/maria-priv.key
    
  • Utiliza la clave anterior para generar un CSR, considerando que deseas acceder al servidor con el FQDN (maria.iesgn.org).
    sudo openssl req -new -sha256 -key /etc/ssl/private/maria-priv.key -out maria.csr
    
  • Envía la solicitud de firma a la entidad certificadora (su compañero). Recibe como respuesta un certificado X.509 para el servidor firmado y el certificado de la autoridad certificadora.

  • Configura tu servidor web con https en el puerto 443, haciendo que las peticiones http se redireccionen a https (forzar https).

  • Modificamos el fichero de configuración:

    <IfModule mod_ssl.c>
        <VirtualHost *:443>
            ServerName maria.iesgn.org
            DocumentRoot /var/www/html/maria.iesgn.org
            ErrorLog ${APACHE_LOG_DIR}/error-maria.log
            CustomLog ${APACHE_LOG_DIR}/access-maria.log combined

            SSLEngine on
            SSLCertificateFile /etc/ssl/certs/maria.crt
            SSLCertificateKeyFile /etc/ssl/private/maria-priv.key
            SSLCertificateChainFile /etc/ssl/certs/cacert.crt

            <Directory /var/www/html/maria.iesgn.org>
                Options Indexes FollowSymLinks
                AllowOverride None
                Require all granted               
            </Directory>
        </VirtualHost>
    </IfModule>
    
  • Movemos los ficheros que hemos generado a la carpeta /etc/ssl/certs y le proporcionamos los permisos necesarios:
    sudo mv maria.crt /etc/ssl/certs/
    sudo mv cacert.crt /etc/ssl/certs/
    sudo chown root:root /etc/ssl/certs/maria.crt
    sudo chown root:root /etc/ssl/certs/cacert.crt
    sudo chmod 644 /etc/ssl/certs/maria.crt
    sudo chmod 644 /etc/ssl/certs/cacert.crt
    
  • Habilitamos el módulo ssl y reiniciamos el servicio apache:
    sudo a2enmod ssl
    sudo a2ensite ssl-maria.iesgn.org.conf
    sudo systemctl reload apache2
    
  • Modificamos el fichero para que realice una redirección de http a https:
    sudo nano /etc/apache2/sites-available/maria.iesgn.org.conf

    #Añadimos la siguiente línea:

    Redirect 301 / https://maria.iesgn.org/
    
  • Reiniciamos el servicio apache:
        sudo systemctl reload apache2
        
  • Comprobamos su funcionamiento:

    15

    16

  • Instala ahora un servidor nginx, y realiza la misma configuración que anteriormente para que se sirva la página con HTTPS.

  • Deshabilitamos apache:

    sudo systemctl disable --now apache2
    
  • Instalamos el servidor nginx:
    sudo apt install nginx
    
  • Creamos el fichero de configuración dentro de la carpeta que hemos creado anteriormente:
    sudo nano /var/www/html/maria.iesgn.org/index.html
    
  • Y dentro de este fichero, escribimos lo siguiente:
    server {
        listen 80;
        listen [::]:80;
        server_name maria.iesgn.org;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name maria.iesgn.org;

        ssl_certificate /etc/ssl/certs/maria.crt;
        ssl_certificate_key /etc/ssl/private/maria-priv.key;
        ssl_trusted_certificate /etc/ssl/certs/cacert.crt;

        root /var/www/html/maria.iesgn.org;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }
    }
    
  • Modificamos el fichero index.html que hemos creado anteriormente:
    <!DOCTYPE html>
        <html>
            <head>
            <title>maria.iesgn.org</title>
            </head>
        <body>
            <h1>maria.iesgn.org</h1>
            <p>Web de prueba para cripto 3 - HTTPS</p>
            <p>PRUEBA NGINX</p>
        </body>
    </html>
    
  • Realizamos la firma del certificado:
    sudo openssl rsa -in /etc/ssl/private/maria-priv.key -out /etc/ssl/private/maria-priv2.key
    
  • Realizamos el enlace simbólico del fichero de configuración y reiniciamos el servicio nginx:
    sudo ln -s /etc/nginx/sites-available/maria.iesgn.org.conf /etc/nginx/sites-enabled/
    sudo systemctl restart nginx
    
  • Comprobamos que el servidor funciona correctamente:

17

18