domingo, 23 de diciembre de 2018

Bot para Telegram con certificado digital autofirmado (self-signed certificate)

Esta entrada es para aquellos que están empezando a trabajar con bots para telegram y que estén teniendo problemas para que su bot reciba los mensajes después de configurar los parámetros de webhook.

La información se encuentra disponible en la documentación de Telegram, sin embargo, entre tanto paso uno se pierde, porque vi más de una pregunta sobre lo mismo: configurar webhook con certificado local, probar procesar mensajes y que no pase nada. El resumen del problema es que el certificado está mal publicado y no nos enteramos :P

Acá un resumen de lo que se debe hacer y cómo dejar el bot funcionando :)

1) Eliminar la asociación anterior del webhook para configurar de nuevo

curl -F "url="  https://api.telegram.org/bot[TOKEN_ID]/setWebhook

Donde "[TOKEN_ID]" obviamente corresponde al token asociado a al bot que se está configurando.


2) Crear el certificado digital con formato PEM para el servidor que se está utilizando y utilizar ese archivo para la navegación https.
En mi caso lo dejé a 3 años ya que es seguro que un año pasa volando, pero eso depende del gusto de cada uno.

openssl req -newkey rsa:2048 -sha256 -nodes -keyout server.key -x509 -days 1095 -out server.pem -subj "/CN=tu.dominio.cl/C=CL/ST=Santiago/L=Santiago"

Acá lo importante es el campo CN dado que debe coincidir con el nombre del servidor para el cual se está creando el certificado. Si ese parámetro está incorrecto, no se validará la navegación entre servidores y el bot no recibirá nada (punto a validar).

3) Asociar el certificado al bot.

curl -F "url=https://tu.dominio.cl/ruta/bot.php" -F "certificate=@/ruta_local/del/archivo/server.pem" https://api.telegram.org/bot[TOKEN_ID]/setWebhook

url = la ruta pública al código del bot.
certificate = ruta del archivo server.pem en el servidor (ruta local).


Si la ruta local del archivo .pem está incorrecta, y a pesar de que el registro del webhook diga que fue exitoso, no se validará la navegación entre servidores y el bot por lo que tampoco se recibirán los mensajes.



4) Revisar el estado del bot en Telegram para confirmar que el certificado está correctamente publicado y funcionando.

https://api.telegram.org/bot[TOKEN_ID]/getwebhookinfo

Si todo va bien, ahí aparecerá que se está utilizando un certificado de forma correcta.

has_custom_certificate: true

En caso de ir algo mal con el certificado, aparecerá un mensaje en ese parámetro. De ser así revisar los puntos marcados con rojo en los pasos anteriores y que coincidan con los valores reales de nombre, token y servidor.

Ahí lo tienen, luego de corregir el detalle del certificado y la ruta, quedará funcionando sin problemas :)
Algo a comentar es que si estuvieron haciendo pruebas enviando mensajes durante un rato y luego de que la configuración queda correcta, empezarán a recibir respuesta por todos esos mensajes de prueba que enviaron ya que quedan en cola en el servidor de Telegram por 24hrs :P.


NOTA:
Asociado al punto 3, aparte de asociar el certificado al bot, debe utilizarse ese certificado en la navegación https del servidor. Para activar la navegación https, si se está usando apache lo práctico es usar la ruta oficial, en ese caso sería dejar los archivos server.key y server.pem en /etc/apache2/ssl, además de cargar esa ruta en el archivo de configuración /etc/apache2/sites-available/default-ssl.conf con los siguientes parámetros:SSLCertificateFile      /etc/apache2/ssl/server.pem
SSLCertificateKeyFile /etc/apache2/ssl/server.key


Referencias:
https://core.telegram.org/bots/webhooks#a-self-signed-certificate
http://snakelab.cc/2016/10/28/telegram_gem_and_self_signed_cert.html

-