Privacidad sin límites: Crea tu propio chat cifrado con PidginChat y OMEMO (¡En solo 5 minutos!)
Tu propia alternativa a Signal sin necesidad de número de teléfono ni límites en la cantidad de dispositivos enlazados. Control total desde GUI o Terminal.
En una época en la que casi todos los mensajes que enviamos pasan por los servidores de alguna empresa, Signal se ha convertido en el estándar de oro para comunicarse en privado pero… ¿Qué es Signal y para qué se usa en todo el mundo? Bueno, Signal es una aplicación de mensajería segura (gratuita y de código abierto) centrada en el cifrado de extremo a extremo (E2E). Es ampliamente utilizada por periodistas, activistas, equipos técnicos y cualquiera que desee proteger sus conversaciones de proveedores, operadores y atacantes en redes públicas. Ofrece llamadas y mensajes encriptados, verificación de números de seguridad entre contactos y un diseño limpio que popularizó la mensajería cifrada end-to-end a escala global.
Signal se ha ganado su reputación a pulso: Democratizó el cifrado E2E para mensajes con una interfaz limpia, la transparencia propia del código abierto y el algoritmo Double Ratchet que cambió para siempre la mensajería segura.
Pero incluso Signal tiene sus limitantes, algunas de ellas son:
Límite de 5 dispositivos vinculados (lo que podría resultar particularmente frustrante para usuarios multi-dispositivo)
Servidores centralizados: Dependes completamente de la infraestructura de Signal.
Identidad basada en número de teléfono, lo que complica el anonimato
Para mí, el primer punto fue el factor decisivo. Necesitaba algo que pudiera:
Usar en tantos dispositivos como quisiera/necesitara
Operar desde una interfaz de texto (por ejemplo, en servidores)
Y aun así mantener un cifrado al nivel de Signal
Fue entonces cuando redescubrí el protocolo XMPP, específicamente a través de PidginChat + OMEMO, lo que me animó a escribir este artículo sobre mi configuración y cómo replicarla, además de algunas variantes y otra información útil. Sin más, ¡Vamos a ello!
🧩 Bajo el Capó: XMPP (feat. PidginChat) + OMEMO
XMPP: La columna vertebral de la mensajería abierta
XMPP (Protocolo Extensible de Mensajería y Presencia) es un estándar abierto para mensajería: el mismo protocolo que impulsó Google Talk y Facebook Chat en sus inicios... Es federado tal y como el correo electrónico: cualquiera puede alojar un servidor, y los servidores se comunican entre sí.
OMEMO: Seguridad de Nivel Signal, Federada
OMEMO es una capa de cifrado para XMPP que implementa el mismo algoritmo Double Ratchet usado por Signal. Ofrece soporte para mensajes offline, sincronización multi-dispositivo y secreto hacia adelante.
¿Qué es el secreto hacia adelante? También conocido como secreto perfecto hacia adelante, básicamente se trata de una implementación criptográfica que significa que si una llave de cifrado a largo plazo se comprometiera hoy, tus mensajes pasados seguirían protegidos; OMEMO/Double Ratchet rota constantemente las claves y descarta las antiguas; cada mensaje (o lote de mensajes) está protegido con material criptográfico fresco y efímero.
En otras palabras: OMEMO nos habilita la misma criptografía estrella de Signal, sin necesidad de depender o estar en el servidor de Signal.
💜 Pidgin & PidginChat
Pidgin es uno de los clientes de chat de código abierto más antiguos y respetados. Nació a principios de los 2000 como Gaim, y evolucionó a lo que conocemos hoy como una aplicación multiprotocolo impulsada por libpurple, una biblioteca basada en plugins que soporta docenas de protocolos de mensajería (IRC, XMPP, ICQ y más). Para muchos usuarios de GNU/Linux, Pidgin fue (y se mantiene) esencial para hablar con personas que tienen presencia en diferentes redes de mensajería (propietarias y libres por igual)
PidginChat por su parte es un servicio XMPP moderno alojado y gestionado por la comunidad que mantiene Pidgin. Utiliza un servidor XMPP ligero al que cualquiera puede unirse, lo que lo hace perfecto si quieres una red lista para usar en un ámbito similar a Signal tras establecer el cifrado adecuado (sin tener que montar tu propio servidor desde un inicio)
Registro rápido en PidginChat
Corto y conciso: Ve a https://pidgin.im/about/pidginchat/ y sigue las instrucciones.
Elaborando:
Básicamente, tendrás que crear una cuenta en su instancia de JetBrains Hub (https://hub.imfreedom.org/) iniciando sesión con tu método preferido; eso creará tu cuenta PidginChat automáticamente (podrás ajustar tu nombre de usuario asignado después ahí mismo en su interfaz web)
Anota tu dirección XMPP (JID): se ve como usuario@pidginchat.com donde usuario se refiere al nombre de usuario asignado en la instancia de Jetbrains Hub.
Úsala para iniciar sesión con cualquier cliente XMPP: te recomendaré algunos a continuación.
Toma en cuenta: Puedes registrarte con un correo desechable y/o un seudónimo. También podrás anonimizar tu JID eliminando metadatos en el panel de JetBrains Hub (tras el registro) o, si prefieres, puedes migrar más tarde a tu propio servidor como ya comenté arriba.
🖥️ Clientes de XMPP: Elige Tu Plataforma
No hay una talla única: Elige el que mejor se adapte a tu flujo de trabajo:
Mi Caso Particular: Mensajería Segura Entre Servidores
Comencé a investigar sobre este tema porque quería encontrar alguna opción para establecer un chat con cifrado E2E por línea de comandos entre servidores en mi VPN/LAN. Sin interfaz gráfica: sólo la terminal.
Eso me llevó a encontrar Profanity, un cliente XMPP por TUI (terminal user interface) que soporta OMEMO una vez que lo compilas correctamente con el debido plugin. Nos desviaremos un poco por esta tangente (siénte libre de saltar esta sección si así lo deseas) y aquí pondré la guía de cómo exactamente lo hice funcionar con las librerías de Homebrew en AlmaLinux 10; una distribución GNU/Linux compatible con Red Hat Enterprise Linux (RHEL) 10.x y otros de sus derivados como RockyLinux, por ejemplo.
Veamos…
Cómo Instalar Profanity con Soporte OMEMO en AlmaLinux 10 (y compatibles)

Profanity es un cliente XMPP rápido y minimalista con soporte para OMEMO, OTR y PGP. Compilarlo con todas las dependencias en una distro moderna tipo RHEL (AlmaLinux 10 como ejemplo) puede ser complicado, es por eso que aquí documento un proceso reproducible de manera que quede como referencia para la posteridad.
NOTA: Los comandos que verás a continuación están descritos para ser ejecutados en un shell de bash
Paso 1: Preparar el Sistema Base
Instala las herramientas de desarrollo y cabeceras del kernel:
sudo dnf -y groupinstall "Development Tools"
sudo dnf -y install glibc-devel glibc-headers libstdc++-devel binutils kernel-headers pkgconf-pkg-configEsto asegura que podamos crear ejecutables con /usr/bin/gcc (de lo contrario el paso de configure podría fallar con un mensaje del tipo: “C compiler cannot create executables”).
Paso 2: Instalar Linuxbrew / Homebrew (si no lo tuvieras ya instalado)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"El script explica lo que hará y se pausa antes de hacerlo. Después de la instalación, añade brew a tu PATH (el mismo STDOUT tras la instalación te dará las instrucciones para hacerlo) e instala gcc desde sus repositorios con:
brew install gccPaso 3: Instalar Dependencias vía Linuxbrew
brew install autoconf automake libtool pkgconf autoconf-archive readline ncurses glib curl libxml2 openssl@3 sqlite libstrophe libsignal-protocol-c libgcrypt libgpg-errorEsto trae las librerías que Profanity necesita para OMEMO y más (ncurses, criptografía, XMPP, etc.).
Paso 4: Asegurarse de que pkg-config Encuentra GLib
Algunas instalaciones necesitan pistas explícitas para los archivos .pc de GLib:
export PKG_CONFIG_PATH="$(brew --prefix)/lib/pkgconfig:$(brew --prefix)/share/pkgconfig:$(brew --cellar glib)/*/lib/pkgconfig:$(brew --cellar glib)/*/share/pkgconfig:${PKG_CONFIG_PATH:-}"Prueba:
pkg-config --modversion glib-2.0Esperado: 2.xx.x
Si ves “not found”:
brew reinstall pkgconfPaso 5: Preparar Flags de build con las rutas de brew
RLB="$(brew --prefix readline)"
NCB="$(brew --prefix ncurses)"
GCR="$(brew --prefix libgcrypt)"
GGE="$(brew --prefix libgpg-error)"
SIG="$(brew --prefix libsignal-protocol-c)"
GLB="$(brew --prefix glib)"
HB="$(brew --prefix)"
export CC=/usr/bin/gcc
export CXX=/usr/bin/g++
unset CFLAGS CXXFLAGS LIBRARY_PATH CPATH
export CPPFLAGS="-I$RLB/include -I$NCB/include -I$GCR/include -I$GGE/include -I$SIG/include -I$GLB/include/glib-2.0 -I$GLB/lib/glib-2.0/include"
export LDFLAGS="-L$RLB/lib -L$NCB/lib -L$GCR/lib -L$GGE/lib -L$SIG/lib -L$GLB/lib -Wl,-rpath,$HB/lib -Wl,-rpath,$NCB/lib -Wl,-rpath,$GCR/lib -Wl,-rpath,$GGE/lib -Wl,-rpath,$RLB/lib -Wl,-rpath,$SIG/lib -Wl,-rpath,$GLB/lib"Esto ayuda a que el paso de configure encuentre:
libsignal-protocol-c
libgcrypt + libgpg-error
readline + ncurses
GLib
Paso 6: Obtener el Código Fuente de Profanity
cd ~
[ -d profanity ] && (cd profanity && git fetch -p && git reset --hard origin/master) || git clone https://github.com/profanity-im/profanity
cd profanity
git clean -xfd
rm -f config.cachePaso 7: Inicializar el Sistema de build
./bootstrap.shEsto genera configure y otros archivos vía autotools.
Paso 8: Configurar con Soporte OMEMO
Añade estos flags extra para tratar de evitar una advertencia común de cURL que parece ahorita está afectando el build de profanity (podría ser arreglado después por la comunidad):
LIBS="$(pkg-config --libs libsignal-protocol-c) -lgpg-error -lgcrypt -lncursesw -lreadline"
CFLAGS="-Wno-error -Wno-error=attribute-warning"
CXXFLAGS="-Wno-error -Wno-error=attribute-warning"
./configure --enable-omemo --prefix="$HOME/.local"Paso 9: Compilar
make -j"$(nproc)"¿Tuviste un error de cURL como curl_easy_setopt espera un argumento long? Aplica este pequeño parche y recompila:
sed -i 's/\(CURLOPT_TIMEOUT,\s*\)2)/\12L)/' src/common.c
make clean
make -j"$(nproc)"Paso 10: Instalar y Validar
Si ya no hubo errores, podemos instalar profanity a nivel usuario y validar al mismo tiempo con:
make install
~/.local/bin/profanity -vEsperado:
Profanity 0.15.x
Características: OMEMO, libsignal-protocol-c, ncurses, readline
¡Listo! Profanity está instalado! Inícialo con:
~/.local/bin/profanitySolución Común de Problemas
Te lo resumo en una tabla:
Volviendo al tema principal…
🧭 (Opcional) Aloja Tu Propio Servidor XMPP
Es posible (y a menudo recomendado) alojar tu propio servidor XMPP (por ejemplo, usando prosody o ejabberd); Haciendo esto, controlas los metadatos, las políticas de retención y la ubicación física del servicio, así como su disponibilidad, acceso, reglas y funciones. En un tutorial posterior exploraremos la configuración paso a paso de un servidor XMPP self-hosted para los que tengan curiosidad sobre el tema.
🔐 Entonces… ¿Qué Tan Seguro Es Esto?
Seamos claros y transparentes:
La criptografía entre ambas opciones es equivalente, pero la privacidad en el mundo real depende de dónde (y cómo) se aloje tu servidor. Si te auto-alojas o usas un proveedor confiable, obtienes una seguridad muy cercana a la de Signal sin centralización.
Algunos consejos adicionales (y un tanto básicos) de privacidad
Regístrate con un seudónimo; Aprovecha que a diferencia de Signal, por ejemplo en este caso PidginChat no requiere número de teléfono.
Elimina los datos del vCard que se genere en la instancia de JetBrains Hub (si optas por configurar con PidginChat) y/o cambia tu JID más tarde.
Considera usar una VPN al realizar tu registro en el hub para mayor privacidad.
Si tu cliente lo permite, fuerza TLS y configúralo para usar el puerto 443 en lugar del puerto predeterminado (me parece que es el 5222) para conectarse. Ojo, esto no interfiere con otros procesos corriendo en tu dispositivo cliente.
Adicional: Verificación de Huellas OMEMO
Como Signal, OMEMO usa huellas por dispositivo. Para evitar ataques man-in-the-middle, verifica las huellas con tus contactos. En casi cualquier cliente de XMPP encontrarás detalles OMEMO en la información del contacto. Compara dichas huellas fuera de banda (es decir, a través de un canal confiable distinto al mensajero como una llamada de teléfono o intercambiando un código QR); Una vez verificadas, marca el dispositivo manualmente como confiable.
Ahora bien, por practicidad puedes permitir la confianza ciega entre dispositivos (muchos clientes de XMPP por defecto hacen esto, de manera que no tengas que verificar las llaves manualmente antes de empezar a conversar para no generar fricciones) pero de todos modos, siempre es bueno revisar de una forma u otra sus huellas criptográficas.
De igual manera, es muy común que los clientes de XMPP tengan un ícono o indicación (usualmente un ícono de candado en clientes gráficos, o el estatus de OMEMO en clientes de texto) dentro de la ventana de conversación para señalizar si dicha conversación está siendo cifrada de punta a punta o no; Siempre revisa la interfaz de usuario: Verifica que el indicador (gráfico o no) señale que el cifrado está habilitado.
Mientras el cifrado esté habilitado, los mensajes son protegidos E2E y están autenticados.
🧐 Reflexiones finales
No vengo a afirmar a la ligera que esta configuración sea más segura que Signal; Signal sigue siendo insuperable por su simplicidad y efecto de red (mucha gente lo usa); Pero configurar XMPP + OMEMO es un tipo diferente de seguridad: un escenario donde tu puedes poseer la infraestructura (tu propio server) y esto trae libertades como:
Chatear en privado dentro de tu propia red (o incluso contigo mismo para pasar mensajes entre dispositivos)
Dependiendo de la plataforma, integrar con scripts de automatización
Conectar cualquier número de dispositivos
Ejecutar un sistema de chat que nunca esté enviando telemetría a terceros
Signal nos dio mensajería cifrada fácil de usar. XMPP + OMEMO nos da cifrado soberano: La capacidad de controlar, alojar y entender todo lo que comprende tu stack de comunicaciones. Puedes comenzar fácil con PidginChat y evolucionar a un servicio auto-hospedado más adelante.
Esta configuración representa privacidad por diseño y autonomía por arquitectura.
🛠️ Herramientas Mencionadas
PidginChat: https://pidgin.im/about/pidginchat
Gajim: https://gajim.org
Monal: https://monal-im.org
Converse.js: https://conversejs.org
Conversations: https://conversations.im
Profanity: https://profanity-im.github.io
Homebrew: https://brew.sh
¡Hasta la próxima! No olviden suscribirse y compartir.







