{"id":1730,"date":"2019-03-05T10:15:15","date_gmt":"2019-03-05T15:15:15","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=1730"},"modified":"2022-03-27T08:39:00","modified_gmt":"2022-03-27T13:39:00","slug":"mqtt-mosquitto-tls","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/mqtt-mosquitto-tls\/","title":{"rendered":"3. MQTT - Mosquitto TLS"},"content":{"rendered":"<p>Los mensajes MQTT que se transmiten como texto simple en la red (inalambrica) y podr\u00edan ser leidos con alg\u00fan software de inspecci\u00f3n de tr\u00e1fico de red. Para a\u00f1adir un nivel de seguridad con los mensajes MQTT se usa TLS.<\/p>\n<p>Esta secci\u00f3n consta de dos partes:<br \/>\n- creaci\u00f3n de los certificados para CA, broker y dispositivos<br \/>\n- configuraci\u00f3n de Mosquitto<\/p>\n<hr \/>\n<h2>1. Creaci\u00f3n de Certificados<\/h2>\n<p>Son archivos que contienen las \"llaves\" de encriptaci\u00f3n que se deben crear o generar para poder realizar todo el proceso de validaci\u00f3n. Esta secci\u00f3n considera que las llaves ser\u00e1n usadas de forma local, por lo que la certificaci\u00f3n de las llaves se realiza en el mismo broker (self-signed certificate).<\/p>\n<p>La generaci\u00f3n de llaves se realiza con la aplicaci\u00f3n \"OpenSSL\" que se incluye con Raspberry OS y para esta ocasi\u00f3n se ejecuta desde un terminal local o remoto (ssh).<\/p>\n<p>Se requieren llaves y certificados para el broker y para cada cliente<\/p>\n<h3>1.1 CA - Certificate authority<\/h3>\n<p>Se require una \"entidad\" para crear los certificados y las llaves usadas en el proceso, concocida como CA.\u00a0 Los archivos creados de guardan en la carpeta:<\/p>\n<pre>cd \/etc\/mosquitto\/ca_certificates\/<\/pre>\n<p>primero se crea la llave, que require establecer una frase para generar el archivo, ejemplo: \"mqttasegurado\" o alguna que le permita establecer una contrase\u00f1a para la generaci\u00f3n de los todos los siguientes certificados y llaves. Anote la frase en algun lugar a su alcance para los pr\u00f3ximos pasos.<\/p>\n<pre>sudo openssl genrsa -des3 -out mqtt-ca.key 2048<\/pre>\n<p>la instrucci\u00f3n genera la siguiente<\/p>\n<pre>Generating RSA private key, 2048 bit long modulus (2 primes)\r\n...........................................+++++\r\n.+++++\r\ne is 65537 (0x010001)\r\nEnter pass phrase for mqtt-ca.key:\r\nVerifying - Enter pass phrase for mqtt-ca.key:\r\n<\/pre>\n<p>El certificado CA firmado con la llave creada en el paso anterior, requiere a\u00f1adir informaci\u00f3n adicional como: pa\u00eds, provincia, ciudad e instituci\u00f3n para asociar al certificado.<\/p>\n<p>En CN (Common Name) use el nombre en la red o IP fijo del broker, ejemplo: 192.168.10.40<\/p>\n<p>La informaci\u00f3n en la parte \"-subj\" permite disponer de un contacto en caso que sea necesario actualizar el archivo del certificado.<\/p>\n<pre>sudo openssl req -new -x509 -days 3650 -extensions v3_ca \\\r\n-subj '\/C=EC\/L=Gye\/CN=192.168.10.40' \\\r\n-key mqtt-ca.key -out mqtt-ca.crt\r\n<\/pre>\n<p>Recuerde revisar los permisos de lectura en el directorio de los archivos para los certificados con la instruccion <code>ls -l<\/code>. pues se requiere poder leerlos para generar las llaves de clientes. Por ejemplo:<\/p>\n<pre>pi@raspberry:\/etc\/mosquitto\/ca_certificates $ ls -l\r\n-rw-r--r-- 1 root root 1196 mar 26 22:46 mqtt-ca.crt\r\n-rw-r--r-- 1 root root 1751 mar 26 22:40 mqtt-ca.key\r\n-rw-r--r-- 1 root root   41 mar 26 23:05 mqtt-ca.srl\r\n-rw-r--r-- 1 root root   73 nov 16  2019 README\r\npi@raspberry:\/etc\/mosquitto\/certs $\r\n<\/pre>\n<p>si requiere cambiarlos usar la instrucci\u00f3n: <code>sudo chown usuario archivo<\/code>, o en otro caso cambiar los permisos de lectura para todos los dem\u00e1s.<\/p>\n<pre>sudo chmod g+r mqtt-ca*<\/pre>\n<h3>1.2 TLS -\u00a0 broker Mqtt<\/h3>\n<p>Los certificados del broker y usuarios se crean en el directorio 'certs', por\u00a0 lo que se cambia de directorio con la instrucci\u00f3n:<\/p>\n<pre>cd \/etc\/mosquitto\/certs\/<\/pre>\n<p>se genera la llave para el broker<\/p>\n<pre>sudo openssl genrsa -out mqtt-srv.key 2048<\/pre>\n<p>Creaci\u00f3n del certificado para el Broker usando la llave del paso anterior.<\/p>\n<p>En CN (Common Name) use el nombre o IP del broker, ejemplo: 192.168.10.50. Este valor es el mismo nombre a usar en la conexi\u00f3n del cliente.<\/p>\n<pre>sudo openssl req -new -out mqtt-srv.csr -key mqtt-srv.key \\\r\n-subj '\/C=EC\/L=Gye\/CN=192.168.10.40'  \r\n<\/pre>\n<p>El siguiente paso es firmar el certificado usando CA:<\/p>\n<pre>sudo openssl x509 -req -days 3650 \\\r\n-CA    \/etc\/mosquitto\/ca_certificates\/mqtt-ca.crt \\\r\n-CAkey \/etc\/mosquitto\/ca_certificates\/mqtt-ca.key \\\r\n-CAcreateserial -in mqtt-srv.csr -out mqtt-srv.crt\r\n<\/pre>\n<h3>1.3 Huella del certificado: fingerprint<\/h3>\n<p>Para usar en la programaci\u00f3n del archivo.ino del dispositivo.<\/p>\n<pre>openssl x509 -noout -in mqtt-srv.crt -fingerprint\r\n<\/pre>\n<p>Recuerde revisar los permisos de lectura de los certificados, y modifique los que sean necesarios.<\/p>\n<p>Realizar lo mismo de los permisos que para el directorio <code>\/etc\/mosquitto\/ca_certificates<\/code><\/p>\n<hr \/>\n<h2>2. Configuraci\u00f3n de Mosquitto<\/h2>\n<p>La configuraci\u00f3n del broker debe contener cu\u00e1les son los certificados para la encriptaci\u00f3n de los mensajes.<\/p>\n<p>La<em><strong> configuraci\u00f3n del broker<\/strong><\/em> mosquitto se encuentra en el archivo <code>\/etc\/mosquitto\/mosquitto.conf<\/code> que se modifica para activar la encriptaci\u00f3n con TLS.<\/p>\n<p>El archivo de configuraci\u00f3n se abre desde la consola con la instrucci\u00f3n:<\/p>\n<pre>sudo nano \/etc\/mosquitto\/mosquitto.conf<\/pre>\n<p>Se a\u00f1aden las instrucciones:<\/p>\n<pre># Port to use for the default listener.\r\nport 8883\r\n# \"c_rehash \" each time you add\/remove a certificate.\r\n#capath\r\ncafile \/etc\/mosquitto\/ca_certificates\/mqtt-ca.crt\r\n\r\n# Path to the PEM encoded server certificate.\r\ncertfile \/etc\/mosquitto\/certs\/mqtt-srv.crt\r\n\r\n# Path to the PEM encoded keyfile.\r\nkeyfile \/etc\/mosquitto\/certs\/mqtt-srv.key\r\n\r\n# This option defines the version of the TLS protocol to use for this listener.\r\n# The default value allows v1.2, v1.1 and v1.0, if they are all supported by\r\n# the version of openssl that the broker was compiled against. For openssl &gt;=\r\n# 1.0.1 the valid values are tlsv1.2 tlsv1.1 and tlsv1. For openssl &lt; 1.0.1 the\r\n# valid values are tlsv1.\r\ntls_version tlsv1.2\r\n<\/pre>\n<p>para activar los cambios, deber reiniciar mosquitto con la instrucci\u00f3n:<\/p>\n<pre>sudo systemctl restart mosquitto\r\n<\/pre>\n<p>Verifique el estado del servidor MQTT desde una consola remota con ssh:<\/p>\n<pre>systemctl status mosquitto<\/pre>\n<p>con lo que se obtiene mensajes semejantes a:<\/p>\n<pre>\u25cf mosquitto.service - Mosquitto MQTT v3.1\/v3.1.1 Broker\r\n   Loaded: loaded (\/lib\/systemd\/system\/mosquitto.service; enabled; vendor preset: enabled)\r\n   Active: <strong>active (running)<\/strong> since Sun 2019-08-11 14:16:50 -05; 9min ago\r\n     Docs: man:mosquitto.conf(5)\r\n           man:mosquitto(8)\r\n Main PID: 394 (mosquitto)\r\n    Tasks: 1 (limit: 2200)\r\n   Memory: 2.4M\r\n   CGroup: \/system.slice\/mosquitto.service\r\n           \u2514\u2500394 \/usr\/sbin\/mosquitto -c \/etc\/mosquitto\/mosquitto.conf\r\n\r\nago 11 14:16:50 raspberrypi mosquitto[394]: 1565551010: Config loaded from \/etc\/mosquitto\/mosquitto.conf.\r\nago 11 14:16:50 raspberrypi mosquitto[394]: 1565551010: Opening ipv4 listen socket on port 8883.\r\n<\/pre>\n<p>revise que todo est\u00e9 funcionando sin inconvenientes, que el puerto 8333 sea el que est\u00e9 activo.<\/p>\n<pre>sudo netstat -lnpt\r\nsudo systemctl status mosquitto\r\nsudo journalctl -u mosquitto\r\n<\/pre>\n<hr \/>\n<h3>3. TLS para los clientes<\/h3>\n<p>Para cada dispositivo que se use para enviar o recibir un mensaje Mqtt se define como un cliente. Cada cliente necesita su propia llave que debe ser firmada por la CA para que sea aceptada en las conexiones TLS.<\/p>\n<p>para generar los certificados podemos regresar al directorio:<\/p>\n<pre>cd \/etc\/mosquitto\/certs\/<\/pre>\n<p>En adelante, llamaremos al dispositivo \"sensor00\" como identificador en cada proceso. Se genera la llave para \"sensor00\"<\/p>\n<pre>sudo openssl genrsa -out sensor00-client.key 2048\r\n<\/pre>\n<p>se crea una solicitud de forma para la llave. El valor de CN debe ser el nombre del dispositivo FQDN o una direcci\u00f3n IP fija.<\/p>\n<p>Para las pruebas, se puede usar la consola remota\u00a0 o una laptop conectada a la misma red que el broker. Recuerde actualizar los datos en la secci\u00f3n \"subj\"<\/p>\n<pre>sudo openssl req -new -out sensor00-client.csr \\\r\n-key sensor00-client.key \\\r\n-subj '\/C=EC\/L=Gye\/CN=192.168.10.40'<\/pre>\n<p>creada la solicitud, se usa\u00a0 para firmarla usando CA, se pedir\u00e1 la frase de la primera secci\u00f3n:<\/p>\n<pre>sudo openssl x509 -req  -days 3650 \\\r\n-CA \/etc\/mosquitto\/ca_certificates\/mqtt-ca.crt \\\r\n-CAkey \/etc\/mosquitto\/ca_certificates\/mqtt-ca.key \\\r\n-CAcreateserial \\\r\n-in sensor00-client.csr -out sensor00-client.crt\r\n<\/pre>\n<p>Para usar en la programaci\u00f3n del archivo.ino del dispositivo.<\/p>\n<pre>openssl x509 -noout -in sensor00-client.crt -fingerprint\r\n<\/pre>\n<p>Recuerde revisar los <em><strong>permisos de lectura de los certificados<\/strong><\/em>, y modificar los que sean necesarios.<\/p>\n<p>Se procede de forma semejante para los otros sensores \"sensor##\" o el nombre que se prefiera y se repite solo \u00e9sta secci\u00f3n.<\/p>\n<p>Repita el ejercicio para el certificado a usar por homeassistant con identificador\u00a0'HA-broker'.<\/p>\n<hr \/>\n<h2>4. Prueba de funcionamiento<\/h2>\n<h3>4.1 Desde la consola ssh<\/h3>\n<p>con los par\u00e1metros, utilice los par\u00e1metros con los que gener\u00f3 los certificados.<\/p>\n<pre>mosquitto_sub -v -h 192.168.10.40 -p 8883 \\\r\n-u 'usuarioprueba' -P 'usuarioclave' \\\r\n--key \/etc\/mosquitto\/certs\/sensor00-client.key \\\r\n--cert \/etc\/mosquitto\/certs\/sensor00-client.crt \\\r\n--cafile \/etc\/mosquitto\/certs\/mqtt-srv.crt \\\r\n-t 'oficina\/mensaje' \\\r\n--tls-version tlsv1.2 -i sensor00<\/pre>\n<p>al ejecutar la instrucci\u00f3n, se pide la frase del certificado, la ingresa y obtiene:<\/p>\n<pre>Enter PEM pass phrase:\r\nClient mosqsub|1557-raspberry sending CONNECT\r\nClient mosqsub|1557-raspberry received CONNACK (0)\r\nClient mosqsub|1557-raspberry sending SUBSCRIBE (Mid: 1, Topic: oficina\/mensaje, QoS: 0)\r\nClient mosqsub|1557-raspberry received SUBACK\r\nSubscribed (mid: 1): 0\r\nON<\/pre>\n<p>Puede cambiar el estado con mosquitto_pub se escribe una instrucci\u00f3n semejante a\u00f1adiendo el mensaje -m 'ON'. Esta instrucci\u00f3n usa otro cliente: sendor01.<\/p>\n<pre>mosquitto_pub -h 192.168.10.40 \\\r\n-u 'usuarioprueba' -P 'usuarioclave' \\\r\n--key    \/etc\/mosquitto\/certs\/sensor01-client.key \\\r\n--cert   \/etc\/mosquitto\/certs\/sensor01-client.crt \\\r\n--cafile \/etc\/mosquitto\/certs\/mqtt-srv.crt \\\r\n-t 'oficina\/mensaje' \\\r\n-p 8883 \\\r\n--tls-version tlsv1.2 -i sensor01 \\\r\n-m 'mensajePorTLS..!'\r\n<\/pre>\n<p>con el siguiente resultado:<\/p>\n<pre>Enter PEM pass phrase:\r\nClient mosqpub|1607-raspberry sending CONNECT\r\nClient mosqpub|1607-raspberry received CONNACK (0)\r\nClient mosqpub|1607-raspberry sending PUBLISH (d0, q0, r0, m1, 'home\/garden\/fountain', ... (2 bytes))\r\nClient mosqpub|1607-raspberry sending DISCONNECT<\/pre>\n<h3>4.2 Con el programa MQTT.fx<\/h3>\n<p>Otra opci\u00f3n para probar la conexi\u00f3n es usando un programa desde una PC y con el certificado de cliente, por ejemplo MQTT.FX que lo puede descargar de forma gratuita.<\/p>\n<p>Realice una copia del certificado de cliente en la pc donde instala el programa MQTT.FC en un directorio de trabajo.<\/p>\n<p>Use los par\u00e1metros requeridos para la conexi\u00f3n en la ventana del men\u00fa \"extras\/edit\/connection profiles\"\u00a0 para usuario y clave, TLS, etc<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1744 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert02.png\" alt=\"\" width=\"511\" height=\"361\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert02.png 511w, https:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert02-300x212.png 300w\" sizes=\"auto, (max-width: 511px) 100vw, 511px\" \/><\/a><\/p>\n<p>Se presiona conectar a MQTT, luego se suscribe al t\u00f3pico de inter\u00e9s y se puede publicar en el mismo t\u00f3pico.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1747 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert03.png\" alt=\"\" width=\"652\" height=\"232\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert03.png 652w, https:\/\/blog.espol.edu.ec\/girni\/files\/2019\/07\/MQTTCert03-300x107.png 300w\" sizes=\"auto, (max-width: 652px) 100vw, 652px\" \/><\/a><\/p>\n<hr \/>\n<h2>5 Revisar conexi\u00f3n SSL<\/h2>\n<p>Sustituir IP_ADDRESS con la direcci\u00f3n IP antes de usar la instrucci\u00f3n.<\/p>\n<pre>openssl s_client --connect IP_ADDRESS:8883<\/pre>\n<hr \/>\n<p><em><strong>Referencias:<\/strong><\/em><\/p>\n<p><a href=\"https:\/\/www.raspberrypi.org\/forums\/viewtopic.php?t=287326\">https:\/\/www.raspberrypi.org\/forums\/viewtopic.php?t=287326<\/a><\/p>\n<p><a href=\"https:\/\/mosquitto.org\/man\/mosquitto-tls-7.html\">https:\/\/mosquitto.org\/man\/mosquitto-tls-7.html<\/a><\/p>\n<p><a href=\"https:\/\/mcuoneclipse.com\/2017\/04\/14\/enable-secure-communication-with-tls-and-the-mosquitto-broker\">https:\/\/mcuoneclipse.com\/2017\/04\/14\/enable-secure-communication-with-tls-and-the-mosquitto-broker\/<\/a><\/p>\n<p><a href=\"http:\/\/www.steves-internet-guide.com\/mosquitto-tls\/\">http:\/\/www.steves-internet-guide.com\/mosquitto-tls\/<\/a><\/p>\n<p><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-security-fundamentals-tls-ssl\/\">https:\/\/www.hivemq.com\/blog\/mqtt-security-fundamentals-tls-ssl\/<\/a><\/p>\n<p><a href=\"https:\/\/www.home-assistant.io\/docs\/mqtt\/broker\/\">https:\/\/www.home-assistant.io\/docs\/mqtt\/broker\/<\/a><\/p>\n<p><iframe loading=\"lazy\" title=\"MQTT -  to encrypt or not? How your data is exposed without TLS\" width=\"525\" height=\"295\" src=\"https:\/\/www.youtube.com\/embed\/kJPbaJyaF0Q?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los mensajes MQTT que se transmiten como texto simple en la red (inalambrica) y podr\u00edan ser leidos con alg\u00fan software de inspecci\u00f3n de tr\u00e1fico de red. Para a\u00f1adir un nivel de seguridad con los mensajes MQTT se usa TLS. Esta secci\u00f3n consta de dos partes: - creaci\u00f3n de los certificados para CA, broker y dispositivos &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/mqtt-mosquitto-tls\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"3. MQTT - Mosquitto TLS\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1447336],"tags":[1293414,602214,1457735],"class_list":["post-1730","post","type-post","status-publish","format-standard","hentry","category-mqtt-mosquitto","tag-broker","tag-iot","tag-mqtt"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=1730"}],"version-history":[{"count":29,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1730\/revisions"}],"predecessor-version":[{"id":3744,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1730\/revisions\/3744"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=1730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=1730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=1730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}