Ir al contenido principal
Todas las coleccionesGuías de desarrollador
Seguridad: conéctate al broker MQTT de Ubidots con seguridad TLS
Seguridad: conéctate al broker MQTT de Ubidots con seguridad TLS

Un ejemplo en Python sobre cómo usar nuestro broker MQTT con TLS.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de 4 meses

En nuestra guía de seguridad de Ubidots, explicamos por qué es importante el cifrado para IoT y cómo soportamos dos métodos principales para el cifrado de datos: SSL para comunicaciones HTTP y TLS para MQTT.

MQTT es un protocolo de mensajería de publicación/suscripción optimizado para IoT que soporta cifrado TLS. TLS (Seguridad de la Capa de Transporte) proporciona un canal de comunicación seguro entre un cliente y un servidor. Al igual que SSL, TLS es un protocolo criptográfico que utiliza un mecanismo de handshake para crear una conexión segura entre el cliente y el servidor. Una vez que el handshake se completa, se establece una comunicación cifrada entre el cliente y el servidor, y ningún atacante podría entender el contenido de la comunicación.

En esta guía, veremos cómo publicar mensajes MQTT usando cifrado TLS.

1. Obtén nuestro certificado SSL

A diferencia del tráfico MQTT no cifrado, un cliente habilitado para TLS necesitará un certificado almacenado en su lado. Así que empecemos por almacenar ese certificado localmente creando un nuevo archivo de texto e ingresando el texto a continuación:

-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

Luego guárdalo y asígnale un nombre, en este caso "industrial.pem":

2. Instala MQTT Paho

Paho es un cliente MQTT popular para Python, que nos ha funcionado bastante bien. Puedes instalarlo usando pip:

pip install paho-mqtt==1.3

Para solucionar problemas, o simplemente para aprender más, consulta la página de paho-mqtt.

3. Crea un script en Python

Abre un archivo de Python nuevo y copia el código a continuación. Ten en cuenta que:

  • El puerto del broker MQTT es 8883, en lugar de 1883.

  • TLSv1.1 y TLSv1.2 son compatibles (en Python: ssl.PROTOCOL_TLSv1_1 y ssl.PROTOCOL_TLSv1_2).

  • Este es un ejemplo de publicación, pero también debería funcionar para suscripción. Solo especifica la configuración de TLS antes de la línea "connect".

  • Debes reemplazar la variable TLS_CERT_PATH con la ruta donde guardaste el archivo anterior con el certificado.

  • Debes reemplazar MQTT_USERNAME con el token de tu cuenta Ubidots.

'''
Sends data to Ubidots using MQTT over TLS

Example provided by Jose Garcia @Ubidots Developer
'''

import paho.mqtt.client as mqttClient
import time
import json
import ssl

'''
global variables
'''

connected = False # Stores the connection status
BROKER_ENDPOINT = "industrial.api.ubidots.com"
TLS_PORT = 8883 # Secure port
MQTT_USERNAME = "" # Put here your Ubidots TOKEN
MQTT_PASSWORD = "" # Leave this in blank
TOPIC = "/v1.6/devices/"
DEVICE_LABEL = "truck"
TLS_CERT_PATH = "/path/to/industrial.pem" # Put here the path of your TLS cert

'''
Functions to process incoming and outgoing streaming
'''

def on_connect(client, userdata, flags, rc):
global connected # Use global variable
if rc == 0:

print("[INFO] Connected to broker")
connected = True # Signal connection
else:
print("[INFO] Error, connection failed")


def on_publish(client, userdata, result):
print("Published!")


def connect(mqtt_client, mqtt_username, mqtt_password, broker_endpoint, port):
global connected

if not connected:
mqtt_client.username_pw_set(mqtt_username, password=mqtt_password)
mqtt_client.on_connect = on_connect
mqtt_client.on_publish = on_publish
mqtt_client.tls_set(ca_certs=TLS_CERT_PATH, certfile=None,
keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqtt_client.tls_insecure_set(False)
mqtt_client.connect(broker_endpoint, port=port)
mqtt_client.loop_start()

attempts = 0

while not connected and attempts < 5: # Wait for connection
print(connected)
print("Attempting to connect...")
time.sleep(1)
attempts += 1

if not connected:
print("[ERROR] Could not connect to broker")
return False

return True


def publish(mqtt_client, topic, payload):

try:
mqtt_client.publish(topic, payload)

except Exception as e:
print("[ERROR] Could not publish data, error: {}".format(e))


def main(mqtt_client):
payload = json.dumps({"tls_publish_test": 20})
topic = "{}{}".format(TOPIC, DEVICE_LABEL)



if not connect(mqtt_client, MQTT_USERNAME,
MQTT_PASSWORD, BROKER_ENDPOINT, TLS_PORT):
return False

publish(mqtt_client, topic, payload)

return True


if __name__ == '__main__':
mqtt_client = mqttClient.Client()
while True:
main(mqtt_client)
time.sleep(10)

Este script enviará el valor "20", cada 10 segundos, a un dispositivo llamado "mqtt" dentro de tu cuenta de Ubidots. Al ejecutar el código:

python publish_singlevalue_tls.py 

... Deberías obtener algo como esto:

Conectando...Conectado al broker{"tls_publish_test": 20}¡Publicado!

Este ejemplo fue escrito en Python, pero cualquier lenguaje de programación que soporte MQTT+TLS debería ofrecer una opción para incluir un certificado SSL. Esperamos que esto haya sido útil y no dudes en contactar a tu ejecutivo de cuenta para mayor soporte.

¿Ha quedado contestada tu pregunta?