1. Diferencias entre cert.pem
, key.pem
, server.crt
y server.key
Estos archivos son fundamentales en la configuración de SSL/TLS en servidores. Aquí tienes sus funciones y diferencias:
-
cert.pem
oserver.crt
: Este archivo contiene el certificado público del servidor en formato PEM. Es la "identidad pública" del servidor, usada para demostrar su autenticidad. Un certificado normalmente está firmado por una Autoridad de Certificación (CA) para garantizar su confiabilidad. -
key.pem
oserver.key
: Este archivo contiene la clave privada del servidor en formato PEM. Es confidencial y se utiliza para descifrar la comunicación cifrada. Este archivo debe protegerse cuidadosamente, ya que su divulgación comprometería la seguridad del servidor.
-
Diferencias:
-
server.crt
/cert.pem
son certificados públicos que puedes compartir con los clientes. -
server.key
/key.pem
son claves privadas que nunca deben compartirse.
-
2. Propósito del código proporcionado
El código configura SSL/TLS en un servidor.
init_openssl()
init_openssl()
Esta función inicializa la biblioteca OpenSSL y
carga algoritmos de cifrado y cadenas de errores. Es el primer paso
necesario antes de usar cualquier funcionalidad de OpenSSL.
void init_openssl() { SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); }
create_context()
create_context()
Crea un contexto SSL que
define los parámetros de la conexión segura. Utiliza
SSLv23_server_method
, que permite seleccionar automáticamente el
mejor protocolo SSL/TLS disponible.
SSL_CTX *create_context() { const SSL_METHOD *method = SSLv23_server_method(); SSL_CTX *ctx = SSL_CTX_new(method); if (!ctx) { perror("No se pudo crear el contexto SSL"); exit(EXIT_FAILURE); } return ctx; }
configure_context()
configure_context()
Configura el contexto SSL con el
certificado y la clave privada:
-
SSL_CTX_use_certificate_file
carga el certificado público del servidor (server.crt
en este caso). -
SSL_CTX_use_PrivateKey_file
carga la clave privada del servidor (server.key
).
void configure_context(SSL_CTX *ctx) { SSL_CTX_set_ecdh_auto(ctx, 1); // Cargar certificados (ajusta los nombres de archivo según tus archivos locales) if (SSL_CTX_use_certificate_file(ctx, "server.crt", SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } if (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } }
Estas configuraciones aseguran que el servidor pueda establecer conexiones TLS seguras.
Función cleanup_openssl()
Esta función sirve para liberar recursos utilizados por OpenSSL después de que el servidor finaliza su ejecución.
En init_openssl.c
:
void cleanup_openssl() { EVP_cleanup(); // Limpia los algoritmos de cifrado cargados ERR_free_strings(); // Limpia las cadenas de error de OpenSSL }
📌 Resumen del flujo del código completo
-
Inicialización (
init_openssl
) Prepara OpenSSL cargando los algoritmos de cifrado y cadenas de error. -
Creación del contexto (
create_context
) Establece un contexto SSL para manejar conexiones seguras. -
Configuración del contexto (
configure_context
) Configura el contexto con el certificado público (server.crt
) y la clave privada (server.key
). -
Limpieza (
cleanup_openssl
) Libera los recursos de OpenSSL una vez que el servidor ha terminado.
Notas finales:
-
Asegúrate de que los archivos
server_certificado.crt
yserver.key
sean válidos y estén en la misma carpeta que tu ejecutable, o ajusta las rutas en el código. -
Si necesitas generar estos archivos para pruebas locales, puedes usar
OpenSSL con comandos como:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
Esto genera una clave privada (server.key
) y un certificado
autofirmado (server.crt
).
Leer mas en https://weblinus.com/protocolos-ssl-tls-y-https/