Implantación de Aplicaciones Web
José Juan Sánchez Hernández
Curso 2024/2025
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:
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.
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:
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 subcomando req
se utiliza para
crear solicitudes de certificado en formato PKCS#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 privada RSA
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:
ES
para
España.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 []:
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"
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 puerto 443
(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 dominio
practica-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.
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.
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 sintaxis
RewriteRule 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 valor
https://%{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 texto on
si la
conexión utiliza SSL/TLS o off
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.
Paso 6
Reiniciamos el servicio de Apache
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
.
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.
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.
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
El documento técnico README.md
tiene que estar escrito
en Markdown
y debe incluir como mínimo los siguientes
contenidos:
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.
mod_rewrite
de Apache. Documentación oficial de
Apache.
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.