El proyecto consiste en un servidor HTTP simple que permite la descarga de archivos, como en cualquier servidor web. Soportando 煤nicamente el m茅todo GET
, el servidor es capaz de responder a las solicitudes de los clientes, enviando el archivo solicitado en caso de que exista, o un mensaje de error en caso contrario.
Donde las cabeceras de las solicitudes no son de importancia, el servidor no las procesa, y simplemente las ignora. Por otro lado, las cabeceras de las respuestas son generadas autom谩ticamente por el servidor, entregando prioritariamente el tipo de contenido del archivo solicitado, y el largo del contenido en el caso que corresponda.
Si la ruta del archivo solicitado no cumple de cierta forma la siguiente expresi贸n regular:
.[a-zA-Z0-9]+$
, es decir, si no tiene una extensi贸n, el servidor entender谩 que se trata de un directorio, y buscar谩 el archivoindex.html
dentro de dicho directorio. En caso de no encontrarlo, responder谩 con un mensaje de error.Extra
En caso de considerarse la ruta un directorio y la solicitud no termina con/
, el servidor realizar谩 la redirecci贸n (302) a la misma ruta, pero con/
al final.
El protocolo HTTPS es soportado por el servidor, permitiendo la comunicaci贸n segura entre el cliente y el servidor. Para ello, es necesario especificar el certificado y la clave privada del servidor al momento de iniciar el programa. En caso de no especificarlos, el servidor solamente aceptar谩 conexiones HTTP.
Los requisitos para poder ejecutar el proyecto son los siguientes:
- CMake 3.10
- Make
- C++ 11
- OpenSSL
Para instalar y compilar el proyecto es necesario ejecutar los siguientes comandos:
$ mkdir build
$ cd build
$ cmake ..
$ make
Para iniciar el servidor es necesario especificar el puerto en el que se va a escuchar. El servidor se ejecuta de la siguiente manera:
$ ./server -p <puerto> [-c <certificado> -k <clave>]
Si el programa no detecta la carpeta
www
en el directorio actual, se crear谩 la respectiva carpeta.
Generar certificado SSL
Se puede generar un certificado SSL para utilizarlo con el servidor. Para ello, es necesario tener instalado OpenSSL. Luego, se deben realizar los siguientes pasos:
- Generar el certificado de la Autoridad de Certificaci贸n (CA):
$ openssl genrsa -out CA.key -des3 2048
$ openssl req -x509 -sha256 -new -nodes \
-days 3650 -key CA.key -out CA.pem
Estos comandos generar谩n una clave privada (CA.key
) y un certificado de la CA (CA.pem
) que se utilizar谩 para firmar el certificado del servidor.
Una vez generado el certificado de la CA
, se crea el certificado para el servidor y se firma con el certificado de la CA
.
- Generar el certificado del servidor:
$ openssl genrsa -out <nombre>.key -des3 2048
$ openssl req -new -key <nombre>.key -out <nombre>.csr
$ openssl x509 -req \
-in <nombre>.csr \
-CA CA.pem \
-CAkey CA.key \
-CAcreateserial \
-days 3650 \
-sha256 \
-extfile <(echo -e "authorityKeyIdentifier = keyid,issuer\nbasicConstraints = CA:FALSE\nkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment\nsubjectAltName = @alt_names\n\n[alt_names]\nDNS.1 = localhost\nIP.1 = 127.0.0.1") \
-out <nombre>.crt
Por 煤ltimo, es necesario importar el certificado CA.pem
en el navegador web que se utilizar谩 para acceder al servidor. Esto permitir谩 que el certificado sea reconocido como v谩lido y no se muestre un mensaje de advertencia en el navegador. (Opcional)
Una vez realizado lo anterior, se puede iniciar el servidor con el certificado y su respectiva clave privada:
$ ./server -p <puerto> -c <nombre>.crt -k <nombre>.key
Una vez iniciado el servidor, se puede acceder a los archivos que se encuentran en la carpeta www
desde un navegador web o utilizando alg煤n servicio como Postman, Hoppscotch o Netcat. Por ejemplo, si el servidor se est谩 ejecutando en el puerto 8080
, se puede acceder a la p谩gina index.html
desde la siguiente URL: http://localhost:8080/.
Proyecto realizado por:
- Francisco Cea
- Oscar Castillo
- Mat铆as Gayoso