Gyakorlat – Privát MQTT-közvetítő üzembe helyezése

Befejeződött

Ebben a gyakorlatban megtanulhatja, hogyan telepítheti saját Mosquitto MQTT-brókerét. Ez a lecke egy speciális témakör, és feltételezi, hogy jól ismeri a Linuxot.

Privát Mosquitto MQTT-közvetítőt futtathat egy Azure-beli virtuális gépen. Privát MQTT-közvetítő futtatásával bárhonnan biztonságosan csatlakozhat az Azure Sphere-hez.

A webes terminál és az Altair emulátor közötti MQTT-üzeneteket ügyféltanúsítványokkal kell aláírni és titkosítani. A TLS-tanúsítványok létrehozásának legegyszerűbb és legegyszerűbb módja egy önaláírt hitelesítésszolgáltatói (CA-) tanúsítvány létrehozása. Az önaláírt hitelesítésszolgáltatói tanúsítvány használatával ügyfélkulcsokat és tanúsítványokat hozhat létre.

A Mosquitto MQTT-közvetítő linuxos telepítése a legegyszerűbb megoldás, mivel a legtöbb csomagkezelő tartalmazza a legújabb buildeket. Az ebben a gyakorlatban ismertetett eljárásokkal állítson be egy Ubuntu 20.04 LTS-t futtató Azure-beli virtuális gépet.

Megjegyzés:

A költségek minimalizálása érdekében az MQTT-közvetítő futtatható egy általános célú B1 termékváltozatú virtuális gépen, amely leállítható, ha nincs használatban.

A K21 Academy alábbi blogbejegyzése nagyszerű útmutató egy Ubuntu-kiszolgáló Azure-beli telepítéséhez: Ubuntu virtuális gép létrehozása és Csatlakozás az Azure-ban.

Ubuntu virtuális kiszolgáló létrehozása

  1. Nyissa meg az Azure Portalt. A főmenüben válassza az Erőforrás létrehozása lehetőséget.
  2. Keressen rá a virtuális gépre, és válassza a Létrehozás lehetőséget.
  3. Hozzon létre egy erőforráscsoportot, nevezze el a virtuális gépet, és válasszon egy helyet. Nevezze el a rendszerképet Ubuntu Server 20.04 LTS Gen 1-nek, és állítsa a méretet Standard_B1ls - 1 vcpu, 0,5 GIB memória értékre. Válassza ki az SSH nyilvános kulcsát, majd nevezze el a kulcspárt ugyanúgy, mint a virtuális gép neve.
  4. Válassza a Tovább: Lemezek >lehetőséget, majd válassza a Standard HDD vagy a Standard SSD LRS lehetőséget.
  5. Select Review + create.
  6. Select Create.
  7. Töltse le az SSH titkos kulcsát, és tárolja a ~/.shh mappában.

A virtuális gép üzembe helyezése körülbelül egy percet vesz igénybe.

A virtuális gép konfigurálása

  1. Válassza az Erőforrás megnyitása lehetőséget.

  2. Válassza ki a nem konfigurált DNS-nevet. Ezután állítsa be a DNS-nevet, és állítsa be a kívánt tétlenségi időtúllépési értéket. Javasoljuk, hogy növelje az üresjárati időtúllépést.

  3. Válassza a Mentés parancsot.

  4. A böngésző Vissza gombját választva visszatérhet a virtuális gép Áttekintés paneljére.

  5. Másolja a DNS-nevet a Jegyzettömb, mert a tanúsítványok konfigurálásakor szüksége lesz rá.

  6. Válassza a Hálózatkezelés panelt a bejövő portszabályok beállításához a Bejövő portszabály hozzáadása gombbal. Adja hozzá a következő szabályokat:

    Célport Protokoll Name Prioritás Leírás
    80 TCP Port_80 310 Tanúsítványmegújítás titkosítása
    8884 TCP Port_8884 311 MQTT, titkosított, ügyféltanúsítvány szükséges
    8091 TCP Port_8091 312 MQTT websocketeken keresztül, titkosított, hitelesített

Igény szerint történő hozzáférés engedélyezése

  1. Válassza a Konfiguráció panelt.
  2. Válassza az Igény szerint engedélyezés lehetőséget.

Csatlakozás a virtuális gépre az asztalról

  1. Válassza ki a Csatlakozás panelt.

  2. Állítsa a forrás IP-címét a Saját IP-címre.

  3. Válassza a Hozzáférés kérése lehetőséget.

  4. Az asztalról az SSH-t a virtuális gépre:

    ssh -i <private key path> <username>@<host dns name>
    

    Az első csatlakozás egy-két percet is igénybe vehet.

Az Ubuntu konfigurálása

  1. Operációsrendszer-frissítések alkalmazása:

    sudo apt update && sudo apt -y upgrade
    
  2. Telepítse a szükséges szoftvert:

    sudo apt install -y mosquitto mosquitto-clients python3-pip && \
    sudo pip3 install paho-mqtt
    

A Mosquitto MQTT-közvetítő biztonságossá tételének elősegítése

Az alábbi lépések tanúsítványokat állíthatnak be az Altair emulátor és a webes terminál közötti kommunikáció biztonságossá tételéhez. Az eredmény egy önaláírt tanúsítvány lesz, amely két évig (730 napig) érvényes.

  1. Hozzon létre egy Bash-változót CommonName az Ubuntu-kiszolgáló DNS-nevére:

    CommonName=<Your Ubuntu Server DNS Name>
    
  2. Ideiglenes munkamappa létrehozása:

    mkdir -p ~/mosquitto_certs && cd ~/mosquitto_certs
    
  3. Hozza létre az önaláírt hitelesítésszolgáltatói tanúsítványt:

    openssl req -new -x509 -days 730 -nodes -extensions v3_ca -keyout ca.key -out ca.crt
    

    Önaláírt hitelesítésszolgáltatói tanúsítvány létrehozásakor használhatja az alapértelmezett értéket, de a köznapi névnek (CN) meg kell egyeznie a kiszolgáló DNS-nevével.

  4. A kiszolgálótanúsítvány létrehozása:

    openssl genrsa -out server.key 2048 && \
    openssl req -new -out server.csr -key server.key -subj "/CN=$CommonName" && \
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 730 && \
    openssl rsa -in server.key -out server.key
    
  5. Hozza létre a Mosquitto ügyféltanúsítványait:

    openssl genrsa -out client.key 2048 && \
    openssl req -new -out client.csr -key client.key -subj "/CN=$CommonName" && \
    openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 730 && \
    openssl rsa -in client.key -out client.key
    
  6. Olvasási hozzáférés biztosítása a kulcsokhoz:

    sudo chmod a+r *.key
    
  7. Tanúsítványok másolása a Mosquitto mappába:

    sudo cp ca.crt /etc/mosquitto/ca_certificates &&
    sudo cp server.crt /etc/mosquitto/ca_certificates &&
    sudo cp server.key /etc/mosquitto/ca_certificates
    

A Let's Encrypt telepítése

A Let's Encrypt egy nonprofit hitelesítésszolgáltató, amely TLS-tanúsítványokat biztosít 260 millió webhelynek. Egy ingyenes Let's Encrypt tanúsítványt fogunk használni az MQTT-üzenetek biztonságossá tételéhez a webes terminál és a Mosquitto MQTT közvetítő között.

Az alábbi utasítások végigvezetik a Certbot ACME-ügyfél Ubuntu-kiszolgálón való telepítésén. A titkosítás által kibocsátott tanúsítványok hat hónap után lejárnak. A Certbot-ügyfél biztosítja, hogy a tanúsítványok a lejáratuk előtt frissülnek.

További információkért tekintse meg a Certbot webhelyén található utasításokat.

  1. Másolja és illessze be a következő parancsblokkot az SSH-munkamenetbe, majd válassza az Enter billentyűt:

    sudo snap install core; sudo snap refresh core && \
    sudo snap install --classic certbot && \
    sudo ln -s /snap/bin/certbot /usr/bin/certbot && \
    sudo certbot certonly --standalone
    
  2. Amikor a rendszer kéri, adja meg az e-mail-címét, és erősítse meg a használati feltételeket.

  3. Amikor a rendszer kéri a kiszolgáló tartománynevét, adja meg a Jegyzettömb átmásolt tartománynevet.

A telepítési folyamat körülbelül öt percet vesz igénybe. Ha elkészült, az alábbi paranccsal tesztelheti, hogy a megújítási folyamat működik-e:

sudo certbot renew --dry-run

A Let's Encrypt tanúsítványokat az alábbi paranccsal tekintheti meg:

sudo ls -all /etc/letsencrypt/live/$CommonName

A felhasználónév és a jelszó létrehozása a webes terminálhoz

A webes terminál a Let's Encrypt tanúsítvány használatával titkosítja az MQTT-forgalmat az interneten keresztül. A webes terminál az MQTT-közvetítővel is hitelesít a felhasználónév és a jelszó használatával.

Az alábbi parancs létrehozza az MQTT-közvetítő jelszófájlját, és megkéri, hogy adjon meg jelszót a WebTerminal felhasználónévhez:

sudo mosquitto_passwd -c /etc/mosquitto/passwd WebTerminal

Jegyezze fel a felhasználónevet és a jelszót, mert szüksége lesz rájuk a webes terminál statikus webalkalmazásának konfigurálásához.

A Mosquitto MQTT-közvetítő konfigurálása

Meg kell mondania a Mosquitto közvetítőnek, hogy milyen portokat kell figyelnie, és hol találhatók a tanúsítványok.

  1. Futtassa a következő parancsot a következő konfiguráció másolásához a /etc/mosquitto/conf.d/default.conf fájlba :

    sudo sh -c "cat > /etc/mosquitto/conf.d/default.conf" << 'EOL'
    per_listener_settings true
    
    listener 1883 localhost
    allow_anonymous true
    
    listener 8884
    allow_anonymous false
    cafile /etc/mosquitto/ca_certificates/ca.crt
    keyfile /etc/mosquitto/ca_certificates/server.key
    certfile /etc/mosquitto/ca_certificates/server.crt
    require_certificate true
    use_identity_as_username true
    tls_version tlsv1.2
    
    listener 8091
    password_file /etc/mosquitto/passwd
    allow_anonymous false
    protocol websockets
    certfile /etc/letsencrypt/live/YOUR_DOMAIN_NAME/cert.pem
    cafile /etc/letsencrypt/live/YOUR_DOMAIN_NAME/chain.pem
    keyfile /etc/letsencrypt/live/YOUR_DOMAIN_NAME/privkey.pem
    EOL
    
  2. Frissítse a YOUR_DOMAIN_NAME helyőrzőt a kiszolgáló tartománynevével a Linux sed paranccsal:

    sudo sed -i "s/YOUR_DOMAIN_NAME/$CommonName/g" /etc/mosquitto/conf.d/default.conf
    

A Mosquitto közvetítő tesztelése

A Mosquitto-közvetítő hasznos hibaelhárítási tippje, ha interaktív módban indul, hogy biztosan ne legyen probléma.

  1. Először le kell állítania a Mosquitto-t, majd interaktív módban kell kezdenie. A Ctrl+C billentyűkombinációval lépjen ki a Mosquitto interaktív üzemmódból, majd írja be a következő parancsot:

    sudo systemctl stop mosquitto && sudo mosquitto -c /etc/mosquitto/conf.d/default.conf
    
  2. Frissítse a webes terminál konfigurációját:

    1. Indítsa el a Visual Studio Code-ot.
    2. A Visual Studio Code főmenüjében válassza a Fájl>megnyitása mappát.
    3. Nyissa meg a klónozott vagy letöltött Cloud-Enabled-Altair-on-Azure-Sphere mappát.
    4. Nyissa meg a Altair_Web_Terminal mappát.
    5. Kattintson a Mappa kiválasztása vagy az OK gombra a projekt megnyitásához.
    6. Nyissa meg az Altair webes terminál API-mappáját.
    7. Nyissa meg a local.settings.json fájlt.
    8. Frissítse a következő tulajdonságokat:
      • "MQTT_BROKER": "THE_DNS_NAME_OF_YOUR_VIRTUAL_MACHINE"
      • "MQTT_PASSWORD": "YOUR_WebTerminal_USERNAME_PASSWORD"
  3. Töltse fel az Altair webes terminál helyi beállításait:

    1. Továbbra is a Visual Studio Code-ban válassza az F1 billentyűt.
    2. Írja be a statikus helyi fájlt, majd válassza az Azure Static Web Apps: Upload Local Gépház (Helyi Gépház feltöltése) lehetőséget.
    3. Válassza ki előfizetését.
    4. Válassza a Statikus webalkalmazás lehetőséget. A névhez írja be az AltairWebTerminal nevet.
    5. Válassza ki a környezetet az Éles környezet beállítással.
    6. A rendszer a meglévő beállítások felülírását kéri. Válassza az Igen mindenkinek lehetőséget.
  4. Indítsa el a webes terminált, és válassza a Csatlakozás.

  5. Figyelje meg a Mosquitto közvetítő interaktív kimenetét. A következő kimenethez hasonlóan kell kinéznie:

    1625795690: mosquitto version 1.6.9 starting
    1625795690: Config loaded from /etc/mosquitto/conf.d/default.conf.
    1625795690: Opening ipv4 listen socket on port 1883.
    1625795690: Opening ipv4 listen socket on port 8884.
    1625795690: Opening ipv6 listen socket on port 8884.
    1625795690: Opening websockets listen socket on port 8091.
    1625795897: New client connected from ::ffff:133.233.133.233 as altair1625795897993 (p2, c1, k30, u'WebTerminal').
    

Az Altair emulátor konfigurációjának frissítése

Frissítse az Altair emulátort az új Mosquitto MQTT-közvetítőhöz való csatlakozáshoz:

  1. Másolja az új hitelesítésszolgáltatói és ügyféltanúsítványokat az Altair emulátor tanúsítványmappájába. A legegyszerűbb módszer a fájlkezelő. Keresse meg a tanúsítványmappát, és nyisson meg egy új terminált vagy PowerShell-ablakot.

  2. Futtassa a scp parancsot a tanúsítványok Mosquitto virtuális gépről a tanúsítványmappába való másolásához. A következő parancs feltételezi, hogy a virtuális gép titkos kulcsát a ~/.ssh mappába másolta:

    scp -i ~/.ssh/<your_private_key>.pem <username>@<host_dns_name>:~/mosquitto_certs/* .
    
  3. Nyissa meg az Altair Emulator projektet a Visual Studio Code-ban. Frissítse a definíciót ALTAIR_MQTT_HOST a cmake/altair_config.cmake fájlban a Mosquitto-közvetítő DNS-nevével:

    add_compile_definitions(ALTAIR_MQTT_HOST="REPLACE_WITH_YOUR_VIRTUAL_MACHINE_DNS_NAME")    
    
  4. Mentse a altair_config.cmake fájlt. Ez a lépés automatikusan létrehozza a CMake-gyorsítótárat.

  5. Frissítse a AllowedConnections app_manifest.json szakaszt a virtuális gép új tartománynevére. Távolítsa el a bejegyzést test.mosquitto.org, mert már nem fogja használni ezt a végpontot.

  6. Telepítse újra az Altair emulátort az Azure Sphere-be.

  7. Ellenőrizze a webes terminált. Ekkor megjelenik az Altair emulátor kérése a MEMÓRIAMÉRET megadásához.

  8. Ellenőrizze az interaktív módban futó Mosquitto-közvetítő kimenetét. A következő kódhoz hasonlóan kell kinéznie:

    1625797134: mosquitto version 1.6.9 starting
    1625797134: Config loaded from /etc/mosquitto/conf.d/default.conf.
    1625797134: Opening ipv4 listen socket on port 1883.
    1625797134: Opening ipv4 listen socket on port 8884.
    1625797134: Opening ipv6 listen socket on port 8884.
    1625797134: Opening websockets listen socket on port 8091.
    1625797263: New client connected from ::ffff:133.233.133.233 as altair1625797264017 (p2, c1, k30, u'WebTerminal').
    1625797626: New connection from 133.233.133.233 on port 8884.
    1625797627: New client connected from 133.233.133.233 as altair1234567 (p2, c1, k60, u'your-domain-name.australiaeast.cloudapp.azure.com').
    
    

Indítsa el a Mosquitto MQTT-közvetítőt démon módban

  1. Állítsa le a Mosquitto Broker interaktív példányát a Ctrl+C billentyűkombinációval.

  2. Indítsa el a Mosquitto közvetítőt démon módban:

    sudo systemctl enable mosquitto && sudo systemctl start mosquitto
    

A Python virtuálislemez-kiszolgáló futtatása a virtuális gépen

A Python virtuálislemez-kiszolgáló virtuális gépen való futtatása jelentősen javítja a teljesítményt, mivel kiküszöböli az MQTT-kiszolgálóra való oda-visszautat az asztalról.

Klónozza az Altair-projektet a virtuális gépre:

cd ~/ && git clone --depth 1 https://github.com/AzureSphereCloudEnabledAltair8800/AzureSphereAltair8800.git Altair8800Emulator

A virtuális lemezkiszolgáló automatikus üzembe helyezése

  1. Írja be az alábbi parancsot:

    sudo chmod 744 ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.sh
    
  2. Másolja a Python virtuálislemez-kiszolgálót a /opt könyvtárba:

    sudo cp -r ~/Altair8800Emulator/AltairPY_virtual_disk_server /opt/pyvdisk
    
  3. Telepítse az indítási szolgáltatást:

    sudo cp ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.service /etc/systemd/system
    
  4. Egységek újrabetöltése systemd :

    sudo systemctl daemon-reload
    
  5. Indítsa el a Python virtuális lemezszolgáltatást:

    sudo systemctl start pyvdisk.service
    
  6. Ellenőrizze a Python virtuális lemezszolgáltatás állapotát:

    sudo systemctl status pyvdisk.service
    

Hibaelhárítás

Az mosquitto_pub eszközök és mosquitto_sub az eszközök hasznosak a tanúsítványok teszteléséhez.

  1. A virtuális gépen adja meg a következőt:

    cd ~/mosquitto_certs
    
  2. Írja be az alábbi parancsot:

    mosquitto_pub -h <REPLACE_WITH_YOUR_DOMAIN_NAME> -t "test" -m "hello world" -p 8884 --capath . --cafile ca.crt  --cert client.crt --key client.key
    

    Ha mosquitto_pub nem sikerül, hibaüzenet jelenik meg. A legvalószínűbb ok az, hogy a hitelesítésszolgáltató köznapi neve nem egyezik meg a virtuális gép teljes tartománynevével.

Tanúsítványok tesztelése a kiszolgálón

Adja meg a következő parancsblokkot:

mosquitto_pub -h $(hostname) -t "test" -m "hello world" -p 8884 --capath . --cafile ca.crt  --cert client.crt --key client.key

mosquitto_sub -h $(hostname) -t "test" -p 8884 --capath . --cafile ca.crt  --cert client.crt --key client.key