Apache TLS / PKI(Public Key Infrastructure)
Contexto
Autoridades certificadoras son las responsables de emitir certificados digitales para verificar identidades en internet (servidores, personas, conexiones). El uso de estos certificados permiten conexiones confiables, además de autenticidad y no repudio. TLS (Transport Layer Security) es un protocolo de seguridad basado en criptografía asimétrica que establece un canal seguro entre dos hosts
Objetivos
- Entender el protocolo TLS y HTTPS
- Entender el papel de una CA y el proceso de creación de certificados digitales
- Crear y configurar una CA mediante la utilidad easy-rsa
- Crear par de claves para crear una petición de certificado
- Saber firmar peticiones de certificados digitles(CSR)
- Compartir ficheros(certificados) en la red mediante NFS
- Configurar el protocolo https del servidor web apache para transmisiones seguras.
- Verificar y documentar de forma clara, concisa y completa los pasos llevados a cabo para la finalización de la práctica.
TLS (Transport Layer Security)
TLS es un protocolo de seguridad ampliamente usado diseñado para facilitar privacidad y seguridad en las comunicaciones a través de internet. El uso principal de TLS es encriptar comunicaciones entre el cliente y el servidor. HTTPS es una implementación de TLS que es usado por los servidores web y otras servicios web. Cualquier sitio que utilice HTTPS esta por lo tanto haciendo uso de TLS
Protocolos (Handshake)

Durante el handshake TLS el cliente y el servidor:
- Especifican que versión de TLS (1.0, 1.2, 1.3, etc.) van usar y que suite de cifrado usar.
Hi, I’m your friend, and I want to start a secure conversation. Here are the languages I can speak (types of encryption I can use), and here are some secrets (keys) I’m willing to use to help us understand each other.”
- El servidor se autentica como el auténtico mediante el envio de un certificado
To prove they are the rightful owner of the web site(and not an imposter), your friend shows you a badge (certificate) that a trusted authority has signed.
- Generate session keys for encrypting messages between them after the handshake is complete
After checking the badge, you both agree on a special, private language (a shared secret) for your conversation. This final agreement on a shared secret solidifies your communication channel’s security.
Actividad
Guión esquemático
- Crear petición de certificado y enviar a la CA.
- Instalar el certificado raíz en nuestro sistema operativo.
- Crear, modificar y activar tu web site basándote en el fichero existente /etc/apache/sites-available/default-ssl.conf
- Configurar, probar y verificar mediante un navegador web
En esta práctica configuraremos nuestro servidor web (Apache) para establecer conexiones seguras mediante el protocolo HTTPS. El certificado digital que usaremos deberá estar firmado por una Autoridad Certificadora que crearemos y configuraremos.
Container creation and setup
Para simular un entorno más real, configuraremos nuestro contenedor de Apache con una ip del aula, para crearemos un bridge entre el interfaz virtual eth0 y nuestro interfaz real. Esto en incus es muy sencillo con el comando
$ incus network list
$ incus launch images:ubuntu/noble apache --network <interfaz_host>
Note
Por defecto, la dirección ip la cogerá mediante dhcp de la gw del aula como si se tratase de un host más. Si necesitamos una ip static deberemos editar el fichero /etc/netplan/10-lxc.yaml
Crea la siguente estructura de directorios para tener nuestros certificados organizados
.
└── certs
├── csr
├── etc
├── private
└── signed
La CA denominada pki comparte dos carpetas para que podamos enviarle nuestras peticiones de firma _requests_a y obtener los cetificados firmados issued. Ámbas carpetas se encuentran en la carpeta /home/ubuntu/pki/certs Accede a ellas de forma fácil mediante sshfs
$ sshfs -o allow_other,default_permissions ubuntu@ip:/home/ubuntu/pki/requests /home/ubuntu/certs/csr/
$ sshfs -o allow_other,default_permissions ubuntu@ip:/home/ubuntu/pki/issued /home/ubuntu/certs/signed/
Tip
Mejora la práctica y tu puntuación en ella haciendo los puntos de monaje persistentes, es decir que se creen cuando arranca el sistema.
Creación de certificados
Para habilitar las conexiones seguras TLS en tu servidor web, deberás obtener un certificado firmado por la CA de clase. Para ello debes crear una petición
- Crea la carpeta ~/certs/etc donde guardarás la configuración de tu petición de certificado. modifica la plantilla a tus necesidades
Tip
Añade el la seccion alt_names un DNS a tu elección y la IP de tu server
- Utiliza el siguiente comando para crear la petición
username=<student-gva-username>
openssl req -new \
-config certs/etc/apache.$username.request.asir2.grao.conf \
-out certs/csr/apache.$username.asir2.grao.csr \
-keyout certs/private/apache.$username.asir2.grao.key
Responde:
- Explica la función de cada uno de los ficheros enumerados y utilizados en las prácticas
- apache.$username.asir2.grao.key
- apache.$username.asir2.request.grao.conf
- apache.$username.asir2.grao.csr
- apache.$username.asir2.grao.crt
- apache.$username.asir2.grao.conf
- root-ca.crt
- ¿Para que sirve la opción req?.
- ¿Para que sirve la opción keyout?.
- ¿Cuál es la finalidad del comando anterior?
Instalación del certificado raiz
Para llevar a cabo la el reconocimiento en nuestro S.O del certificado raiz ca-root.crt, deberemos copiar este en la carpeta /usr/local/share_ca-certificates/ y ejecutar el comando update-ca-certificates
Una vez creada la petición, notifica a la CA para que lleve a cabo la firma del certificado.
Utiliza el comando openssl x509 -in <certificado> -noout -text para inspeccionar el certificado y responde:
- Explica qué es un certificado raiz y porqué es neceario instalarlo en nuestro S.O
- _¿Qué hace el comando update-ca-certificates?. ¿en que carpeta están los certificados del sistema?. Indica el comando para comprobar que el certificado raiz de clase esta instalado y reconocible por el S.O
- ¿Cuál es emisor del certificado?
- ¿Cuál es el identificador (SubjectKeyIdentifier) del certificado?
- ¿Cuál es el identificador del emisor del certificado?
Abre el certificado raiz root-ca.crt y comprueba que el identificador del certificado raiz coincide con el identificador del emisor de tu certificado.
Explora el comando openssl x509 -in <certificado> -noout -ext subjectKeyIdentifier para obtener directamente el identificador.
- ¿Qué comando de openssl obtiene directamente el identificador del emisor?
- _¿Qué comandos has utilizado para comparar si id_issuer == cert_issuer_id?
Tip
Muchos ficheros de configuración incluyen comentarios anteponiendo el caracter '#'. En algunas ocasiones será necesario eliminar esos comentarios y líneas en blanco. Puedes usar el comando sed con las siguientes opciones.
sed -e '/^\s*#.*$/d' -e '/^\s*$/d' file
- Explica la finalidad usando lenguaje natural (nada de tecnicismos) la finalidad de las dos expresiones regulares usadas en el comando anterior
Configuración Apache2
Habilita las conexione SSL en tu servidor apache usando el certificado firmado
- Crea la carpeta /etc/apache2/ssl y /etc/apache2/ssl/private para el certificado y su correspondiente clave privada
- Tomando como ejemplo el fichero /etc/apache2/sites-available/default-ssl.conf crea el tuyo propio denominado apache.$username.asir2.grao.conf con la configuración necesaria para habilidar las conexiones SSL mediante el protocolo TLS. Para ello deberás referenciar tanto tu certificado como la clave privada.
Warning
Es probable que sea necesario activar el modulo ssl con el comando a2enmod <nombre_modulo> para activar las conexiones seguras.
-
Crea una página web de prueba y comprueba desde el navegador, que efectivamente las conexiones son seguras
-
Añade el certificado raiz al navegador
Entrega
- Enviar en un documento firmado en formato markdown denominado username_apache_tls.md Con las respuestas a las preguntas planteadas en la actividad. Indica cuando sea necesario el comando utilizado.
Crea un Anexo denominado Anexo I. Ficheros de configuración y añade el contenido en texto (reducelo si es muy grande) excluyendo comentarios y líneas en blanco (utiliza el tip de la pregunta 10) de los siguientes ficheros.
- apache.$username.asir2.grao.key
- apache.$username.asir2.request.grao.conf
- apache.$username.asir2.grao.csr
- apache.$username.asir2.grao.crt
- apache.$username.asir2.grao.conf
Utiliza el formato markdown adecuado para tener un documento estructurado y legible.
- Comprueba el correcto funcionamiento de la actividad mediante la ejecución exitosa de los tests
Propuestas de mejora
Las siguientes propuestas de mejora de la práctica se plantean al alumno como reto para que mejore sus destrezas y conocimientos de las herramientas de administrdor de sistemas y mejore su nota en la asignatura.
- Mejora I- Automatiza la creación y configuración del escenario propuesto para el la práctica que has llevado a cabo mediante el uso de un fichero Taskfile.yml