Práctica 1.4
Implantación de Aplicaciones Web
Curso 2024/2025
1 HTTPS. Creación y configuración de un certificado SSL/TLS autofirmado en Apache
En esta práctica vamos a crear un certificado SSL/TLS
autofirmado con la herramienta openssl
. Una vez creado
vamos a configurar el servidor web
Apache para que utilice dicho certificado.
El proceso de creación de un certificado autofirmado consta de los siguientes pasos:
- Crear una clave privada y un certificado autofirmado.
- Configurar la clave privada y el certificado autofirmado en el servidor web.
Tenga en cuenta que cuando un cliente acceda desde un navegador web a un sitio web que utiliza un certificado autofirmado, se mostrará un mensaje de advertencia indicando que el certificado no es de confianza, porque no ha sido emitido por una autoridad de certificación (CA) reconocida.
Si el cliente acepta el certificado, el navegador web lo almacenará en su almacén de certificados y no volverá a mostrar el mensaje de advertencia.
No se recomienda utilizar certificados autofirmados en sitios web públicos, por lo tanto, esta práctica se utiliza con fines educativos para conocer con detalle cómo funciona el proceso de creación y configuración de un certificado autofirmado.
El proceso de creación de un certificado emitido por una autoridad de certificación (CA), consta de los siguientes pasos:
Crear una clave privada.
Crear una solicitud de certificado o Certificate Signing Request (CSR) y enviarla a una autoridad de certificación (CA).
La CA valida la solicitud y emite un certificado.
El certificado se instala en el servidor web.
1.1 Instalación del servidor web Apache
En primer lugar deberemos tener instado un servidor web Apache en nuestra máquina. Si todavía no lo hemos instalado, podemos hacerlo con los siguientes comandos:
sudo apt update
sudo apt install apache2 -y
1.2 Creación del certificado autofirmado
Para crear un certificado autofirmado vamos a utilizar la utilidad openssl
.
Este es el comando que vamos a utilizar:
sudo openssl req \
-x509 \
-nodes \
-days 365 \
-newkey rsa:2048 \
-keyout /etc/ssl/private/apache-selfsigned.key \
-out /etc/ssl/certs/apache-selfsigned.crt
Vamos a explicar cada uno de los parámetros que hemos utilizado.
req
: El subcomandoreq
se utiliza para crear solicitudes de certificado en formatoPKCS#10
. También puede utilizarse para crear certificados autofirmados, que será el uso que le daremos en esta práctica.-x509
: Indica que queremos crear un certificado autofirmado en lugar de una solicitud de certificado, que se enviaría a una autoridad de certificación.-nodes
: Indica que la clave privada del certificado no estará protegida por contraseña y estará sin encriptar. Esto permite a las aplicaciones usar el certificado sin tener que introducir una contraseña cada vez que se utilice.-days 365
: Este parámetro indica la validez del certificado. En este caso hemos configurado una validez de 365 días.-newkey rsa:2048
: Este parámetro indica que queremos generar una nueva clave privadaRSA
de 2048 bits junto con el certificado. La longitud de clave de 2048 bits es un estándar razonable para la seguridad en la actualidad.-keyout /etc/ssl/private/apache-selfsigned.key
: Indica la ubicación y el nombre del archivo donde se guardará la clave privada generada. En este caso, hemos seleccionado que se guarde en la ruta/etc/ssl/private/apache-selfsigned.key
.-out /etc/ssl/certs/apache-selfsigned.crt
: Indica la ubicación y el nombre del archivo donde se guardará el certificado. En este caso, hemos seleccionado que se guarde en la ruta/etc/ssl/certs/apache-selfsigned.crt
.
Al ejecutar el comando tendremos que introducir una serie de datos por teclado que se añadirán al certificado. Los datos que tenemos que introducir son los siguientes:
- Código del país de 2 caracteres que identifica el
país donde se emite el certificado. Por ejemplo,
ES
para España. - Provincia donde se emite el certificado.
- Localidad donde se emite el certificado.
- Nombre de la organización para la que se emite el certificado.
- Nombre de la unidad o sección de la organización.
- Nombre del dominio para el que se emite el certificado.
- Email.
Ejemplo:
Este ejemplo muestra la salida que obtendremos al ejecutar el comando anterior para crear el certificado autofirmado.
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
1.3 Cómo automatizar la creación de un certificado autofirmado
Para automatizar la creación de un certificado autofirmado desde un
script de Bash, podemos hacer uso del parámetro
-subj
que nos permite pasar los datos se adjuntan al
certificado como argumentos desde la línea de comandos.
Ejemplo:
#!/bin/bash
set -x
# Configuramos las variables con los datos que necesita el certificado
OPENSSL_COUNTRY="ES"
OPENSSL_PROVINCE="Almeria"
OPENSSL_LOCALITY="Almeria"
OPENSSL_ORGANIZATION="IES Celia"
OPENSSL_ORGUNIT="Departamento de Informatica"
OPENSSL_COMMON_NAME="practica-https.local"
OPENSSL_EMAIL="admin@iescelia.org"
# Creamos el certificado autofirmado
sudo openssl req \
-x509 \
-nodes \
-days 365 \
-newkey rsa:2048 \
-keyout /etc/ssl/private/apache-selfsigned.key \
-out /etc/ssl/certs/apache-selfsigned.crt \
-subj "/C=$OPENSSL_COUNTRY/ST=$OPENSSL_PROVINCE/L=$OPENSSL_LOCALITY/O=$OPENSSL_ORGANIZATION/OU=$OPENSSL_ORGUNIT/CN=$OPENSSL_COMMON_NAME/emailAddress=$OPENSSL_EMAIL"
1.4 Cómo consultar la información del sujeto del certificado
openssl x509 -in /etc/ssl/certs/apache-selfsigned.crt -noout -subject
1.5 Cómo consultar la fecha de caducidad del certificado
openssl x509 -in /etc/ssl/certs/apache-selfsigned.crt -noout -dates
1.6 Configuración de un VirtualHost con SSL/TSL en el servidor web Apache
Paso 1
Editamos el archivo de configuración del virtual host donde queremos habilitar el tráfico HTTPS.
En nuestro caso, utilizaremos el archivo de configuración que tiene
Apache por defecto para SSL/TLS, que está en la ruta:
/etc/apache2/sites-available/default-ssl.conf
.
El contenido del archivo será el siguiente:
<VirtualHost *:443>
#ServerName practica-https.local
DocumentRoot /var/www/html
DirectoryIndex index.php index.html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>
Las directivas que hemos configurado son:
<VirtualHost *:443>
: Indica que este virtual host escuchará en el puerto443
(HTTPS).ServerName
: Indica el nombre de dominio y se utiliza para indicar al servidor web Apache qué peticiones debe servir para este virtual host. En nuestro ejemplo estamos utilizando el dominiopractica-https.local
.DocumentRoot
: Es la ruta donde se encuentra el directorio raíz del host virtual.SSLEngine on
: Configuramos que este virtual host utilizará SSL/TLS.SSLCertificateFile
: Indica la ruta donde se encuentra el certificado autofirmado.SSLCertificateKeyFile
: Indica la ruta donde se encuentra la clave privada del certificado autofirmado.
Paso 2
Habilitamos el virtual host que acabamos de configurar.
sudo a2ensite default-ssl.conf
Tenga en cuenta que estamos utilizando el nombre de archivo
default-ssl.conf
porque estamos utilizando el archivo que
tiene Apache por defecto para configurar un virtual host con SSL/TLS,
pero en su caso puede ser otro.
Paso 3
Habilitamos el módulo SSL en Apache.
sudo a2enmod ssl
Paso 4
Configuramos el virtual host de HTTP para que redirija todo el tráfico a HTTPS.
En nuestro caso, el virtual host que maneja las peticiones HTTP está
en el archivo de configuración que utiliza Apache por defecto para el
puerto 80
:
/etc/apache2/sites-available/000-default.conf
.
El contenido del archivo será el siguiente:
<VirtualHost *:80>
#ServerName practica-https.local
DocumentRoot /var/www/html
# Redirige al puerto 443 (HTTPS)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
Las directivas que hemos configurado son:
RewriteEngine On
: Habilita el motor de reescritura de URLs y nos permite usar reglas de reescritura.RewriteCond %{HTTPS} off
: Esta directiva es una condición que comprueba si la petición recibida utiliza HTTPS o no. Si se cumple esta condición, entonces se ejecuta la siguiente línea.RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
: Las reglas de reescritura tienen la siguiente sintaxisRewriteRule Pattern Substitution [flags]
.Pattern
: Es el patrón que se debe cumplir en la URL solicitada para que la regla de reescritura se aplique. En este caso,^
coincide con el principio de la URL, por lo que se aplicará a todas las solicitudes.Substitution
: Es la URL a la que se redirige la solicitud. En este caso, se utiliza el valorhttps://%{HTTP_HOST}%{REQUEST_URI}
y por lo tanto se redirige la solicitud a HTTPS manteniendo el mismo nombre de dominio y URI.flags
: Son los flags que se pueden utilizar para modificar el comportamiento de la regla de reescritura. En este caso, el flag[L,R=301]
indica que es una redirección permanente (Código de estado: 301).
Las directivas utilizan las siguientes variables del servidor que se obtienen de la cabecera de la petición HTTP:
%{HTTPS}
: Contiene el textoon
si la conexión utiliza SSL/TLS ooff
en caso contrario.%{HTTP_HOST}
: Contiene el nombre de dominio que se ha utilizado en la petición del cliente para acceder al sitio web.%{REQUEST_URI}
: Contiene la URI que ha utilizado el cliente para acceder al sitio web. Por ejemplo,/index.html
. Si la petición incluye parámetros éstos estarán almacenados en la variable%{QUERY_STRING}
.
En
la documentación oficial del módulo mod_rewrite
de
Apache puede encontrar más información sobre estas directivas.
Paso 5
Para que el servidor web Apache pueda hacer la redirección de HTTP a
HTTPS es necesario habilitar el módulo rewrite
en
Apache.
sudo a2enmod rewrite
Paso 6
Reiniciamos el servicio de Apache
sudo systemctl restart apache2
Paso 7
Una vez llegado a este punto, es necesario comprobar que el puerto
443
está abierto en las reglas del firewall para permitir
el tráfico HTTPS.
Paso 8
Accede desde un navegador web al nombre de dominio que acabas de
configurar. En nuesro caso será:
https://practica-https.local
.
1.7 Tareas a realizar
En esta práctica tendremos que realizar la instalación de la pila LAMP y la configuración de un certificado SSL/TLS autofirmado en el servidor web Apache, en una instancia EC2 de Amazon Web Services (AWS) con la última versión de Ubuntu Server.
A continuación se describen muy brevemente algunas de las tareas que tendrá que realizar.
Crea una instancia EC2 en AWS.
La Amazon Machine Image (AMI) que vamos a seleccionar para esta práctica será una Community AMI con la última versión de Ubuntu Server.
Cuando esté creando la instancia deberá configurar los puertos que estarán abiertos para poder conectarnos por SSH y para poder acceder por HTTP/HTTPS.
- SSH (TCP)
- HTTP (TCP)
- HTTPS (TCP)
Crea un par de claves (pública y privada) para conectar por SSH con la instancia. También puedes hacer uso de las claves que te proporciona AWS Academy (vockey.pem).
Crea una dirección IP elástica y asígnala a la instancia EC2.
Una vez que haya iniciado su instancia deberá hacer uso de los scripts de bash que diseñó en las prácticas anteriores para automatizar la instalación de la pila LAMP.
Automatice la creación y configuración de un certificado autofirmado SSL/TLS con la utilidad
openssl
para el servidor web Apache.Busque cuál es la dirección IP elástica de su instancia y compruebe que puede acceder a ella desde una navegador web.
1.8 Entregables
Deberá crear un repositorio en GitHub con el nombre de la práctica y añadir al profesor como colaborador.
El repositorio debe tener el siguiente contenido:
- Un documento técnico con la descripción de todos los pasos que se han llevado a cabo.
- Los scripts de Bash que se han utilizado para automatizar la creación y configuración de un certificado SSL/TLS autofirmado en el servidor web Apache.
Además del contenido anterior puede ser necesario crear otros archivos de configuración. A continuación se muestra un ejemplo de cómo puede ser la estructura del repositorio:
.
├── README.md
├── conf
│ ├── 000-default.conf
│ └── default-ssl.conf
└── scripts
├── .env
├── install_lamp.sh
└── setup_selfsigned_certificate.sh
1.8.1 Documento técnico
El documento técnico README.md
tiene que estar escrito
en Markdown
y debe incluir como mínimo los siguientes
contenidos:
- Descripción del proceso de creación y configuración del certificado SSL/TLS autofirmado en el servidor web Apache.
1.8.2 Scripts de Bash
El directorio scripts
debe incluir los siguientes
archivos:
.env
: Este archivo contiene todas las variables de configuración que se utilizarán en los scripts de Bash.install_lamp.sh
: Script de Bash con la automatización del proceso de instalación de la pila LAMP.setup_selfsigned_certificate.sh
: Script de Bash con la automatización del proceso de creación y configuración de un certificado SSL/TLS autofirmado en Apache.
2 Referencias
- ¿Qué es HTTPS?. Documentación oficial de Cloudflare.
- Book: OpenSSL Cookbook. Ivan Ristić.
- Infraestructura de clave pública (PKI). Wikipedia.
- Autoridad Certificadora (CA). Wikipedia.
- X.509. Wikipedia.
- RSA. Wikipedia.
- Módulo
mod_rewrite
de Apache. Documentación oficial de Apache.
3 Licencia
Esta
página forma parte del curso
Implantación de Aplicaciones
Web de José Juan Sánchez
Hernández y su contenido se distribuye bajo una
licencia
Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0
Internacional.