Certificados digitales. HTTPS
Certificado digital de persona física
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.
- 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.
- 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.
-
Tras la descarga, nos preguntará si queremos crear una copia de seguridad del certificado.
-
Finalmente, nos confirmará que la copia de seguridad se ha realizado correctamente.
-
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.
- Para ver las preferencias del navegador, accedemos a
-
¿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.
- Para hacer una copia de seguridad de nuestro certificado, debemos dirigirnos a
-
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
-
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
-
- Al ser la primera vez, autorizamos a autofirma a acceder a nuestra clave privada.
- Elegimos la clave que queremos validar, escribimos el captcha y pulsamos en
Validar
- Como podemos ver, la clave es válida.
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
- Utilizando la página VALIDe y el programa autofirma, firma un docmento con tu certificado y envíalo por correo a un compañero.
- Creamos dos documentos de texto: uno para la comprobación dela 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.
- Tu debes recibir otro documento firmado por un compañero y utilizando las herramientas anteriores debes visualizar la firma
Visualizar FirmayVerificar 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.
- Entre dos compañeros, firmar los dos un documento, verificar la firma para comprobar que está firmado por los dos.
Tarea 4: Autenticación
- 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.
- Nos redigirá a una página donde podremos elegir entre los distintos tipos de acceso y elegimos
Cl@ave.
- 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.
HTTPS / SSL
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:
- Phil’s X509/SSL Guide
- How to setup your own CA with OpenSSL
- Crear autoridad certificadora (CA) y certificados autofirmados en Linux
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 clavecomoel 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.confnos encontraremos con los datos que nuestro compañero debe rellenar para configurar su servidor web, que son:countryNamestateOrProvinceNamelocalityName
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.htmldentro 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/certsy 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:
- 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 / {
ry_files $uri $uri/ =404;
}
}
- Modificamos el fichero
index.htmlque 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: