Tkabber, XMPP, Tcl/Tk, OpenSSL y certificados X.509 con SHA256

Llevo usando Tkabber como cliente XMPP desde principios de 2004, cuando la red XMPP aún no se había estandarizado en el IETF y se llamaba Jabber. Llegué a él tras probar algunos otros y no he cambiado desde entonces. A pesar de su estética arcaica y de estar escrito en un lenguaje anticuado llamado Tcl/Tk. Sin embargo no es un cliente que recomiende. Se adapta bien a mis necesidades, pero mis necesidades son un poco especiales.

Todo fue bien hasta el 6 de marzo de 2015. Ese día intenté conectarme a XMPP como siempre y me saltó el siguiente mensaje de error:

tkabber_1.png

Conecto a XMPP a través de TOR así que un aviso de seguridad con los certificados me enciende todas las alarmas (un nodo TOR de salida puede hacer un Man in the Middle de forma trivial). Conecté por fuera de la red TOR y a través de varios proxies diferentes en distintos países y el error era siempre el mismo.

Si cancelaba la conexión, Tkabber me mostraba lo siguiente:

tkabber_2.png

En cambio si acepto la conexión y me arriesgo a enviar mis credenciales de acceso a XMPP a través de una conexión de la que no me fío un pelo, veo:

tkabber_3.png

Este gráfico, el anterior y un poco de investigación por mi parte dejan claro cual es el problema: el certificado X.509 del servidor XMPP que utilizo se ha renovado el 6 de marzo de 2015 (por eso me empezó a fallar ese día) y por lo que se ve está empleando un algoritmo de hash desconocido.

Todo esto se ve confirmado unos días después por un comentario en la cuenta Twitter oficial, @JabberDotOrg:

We've installed a new certificate. FYI, some IM apps can't handle the stronger signature (SHA-256 vs. SHA-1).

Armado con esta información curioseo un poco el código fuente de Tkabber, pero no consigo nada. No veo dónde poder meter mano a este asunto. Se lo comento a @stpeter y su respuesta me da una pista muy importante:

@jcea Yeah I get a signature warning in Psi on Mac but not on Linux. OpenSSL versions and such. :-/

Ah, ¡el problema puede estar en la librería OpenSSL, y no en Tkabber o en la versión de Tcl/Tk instalados en mi portátil!.

Ejecuto Tkabber y veo qué versión de la librería OpenSSL está utilizando (tengo dos versiones por motivos complejos):

jcea@ubuntu:~$ cat /proc/4004/maps|grep -i ssl
7f9ba7eb8000-7f9ba7f05000 r-xp 00000000 fc:0d 189034                     /lib/libssl.so.0.9.8
7f9ba7f05000-7f9ba8104000 ---p 0004d000 fc:0d 189034                     /lib/libssl.so.0.9.8
7f9ba8104000-7f9ba8106000 r--p 0004c000 fc:0d 189034                     /lib/libssl.so.0.9.8
7f9ba8106000-7f9ba810c000 rw-p 0004e000 fc:0d 189034                     /lib/libssl.so.0.9.8

¡Bingo!. Estoy usando la versión 0.9.8 de OpenSSL. No os emocioneis, es una versión parcheada y segura :-P.

Deduzco que mi instalación Tcl/Tk es antigua y la compilé cuando solo tenía esa versión de OpenSSL instalada. Aprovecho la situación para instalar una versión moderna de Tcl/Tk.

Pero tras actualizar Tcl/Tk todo sigue igual. Uhmmm...

Ejecuto Tkabber con strace para intentar deducir qué está cargando en memoria la librería OpenSSL y veo lo siguiente:

[pid  4065] open("/usr/local/lib/tls1.6/libtls1.6.so", O_RDONLY) = 6
[...]
[pid  4065] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = 6

Vale, Tkabber está utilizando una librería criptográfica llamada TLS. La recompilo para que emplee la última versión de OpenSSL en mi sistema y el resultado es el esperado:

[pid  4082] open("/usr/local/lib/tls1.6.4/libtls1.6.4.so", O_RDONLY) = 6
[...]
[pid  4082] open("/usr/local/ssl//lib/libssl.so.1.0.0", O_RDONLY) = 6

Ahora Tkabber conecta perfectamente. Estamos usando la versión actual de OpenSSL, segura hasta la próxima vulnerabilidad y compatible con el último grito en el estándar TLS y los certificados X.509.

Suspiro aliviado y ya considero seguro conectar a XMPP a través de TOR, otra vez.

Ahora hagamos una copia de seguridad del sistema... :-)