Skip to content
This repository was archived by the owner on Aug 3, 2024. It is now read-only.

Latest commit

 

History

History
81 lines (65 loc) · 4.37 KB

File metadata and controls

81 lines (65 loc) · 4.37 KB

Servidor HTTP simple

Introducción

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 archivo index.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.

Requisitos

Los requisitos para poder ejecutar el proyecto son los siguientes:

Compilación

Para instalar y compilar el proyecto es necesario ejecutar los siguientes comandos:

$ mkdir build
$ cd build
$ cmake ..
$ make

Uso

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

Créditos

Proyecto realizado por:

  • Francisco Cea
  • Oscar Castillo
  • Matías Gayoso