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.pemoserver.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.pemoserver.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.pemson certificados públicos que puedes compartir con los clientes. -
server.key/key.pemson 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_filecarga el certificado público del servidor (server.crten este caso). -
SSL_CTX_use_PrivateKey_filecarga 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.crtyserver.keysean 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/
