Práctica 1.4

Implantación de Aplicaciones Web

José Juan Sánchez Hernández

Curso 2023/2024

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:

  1. Crear una clave privada y un certificado autofirmado.
  2. 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).

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.

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.

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:

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:

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:

Las directivas utilizan las siguientes variables del servidor que se obtienen de la cabecera de la petición HTTP:

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.

  1. Crea una instancia EC2 en AWS.

  2. 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.

  3. 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)
  4. 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).

  5. Crea una dirección IP elástica y asígnala a la instancia EC2.

  6. 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.

  7. Automatice la creación y configuración de un certificado autofirmado SSL/TLS con la utilidad openssl para el servidor web Apache.

  8. 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:

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:

1.8.2 Scripts de Bash

El directorio scripts debe incluir los siguientes archivos:

2 Referencias

3 Licencia

Licencia de Creative Commons
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.