Gyakorlat – Privát MQTT-közvetítő üzembe helyezése
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
- Nyissa meg az Azure Portalt. A főmenüben válassza az Erőforrás létrehozása lehetőséget.
- Keressen rá a virtuális gépre, és válassza a Létrehozás lehetőséget.
- 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.
- Válassza a Tovább: Lemezek >lehetőséget, majd válassza a Standard HDD vagy a Standard SSD LRS lehetőséget.
- Select Review + create.
- Select Create.
- 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
Válassza az Erőforrás megnyitása lehetőséget.
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.
Válassza a Mentés parancsot.
A böngésző Vissza gombját választva visszatérhet a virtuális gép Áttekintés paneljére.
Másolja a DNS-nevet a Jegyzettömb, mert a tanúsítványok konfigurálásakor szüksége lesz rá.
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
- Válassza a Konfiguráció panelt.
- Válassza az Igény szerint engedélyezés lehetőséget.
Csatlakozás a virtuális gépre az asztalról
Válassza ki a Csatlakozás panelt.
Állítsa a forrás IP-címét a Saját IP-címre.
Válassza a Hozzáférés kérése lehetőséget.
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
Operációsrendszer-frissítések alkalmazása:
sudo apt update && sudo apt -y upgrade
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.
Hozzon létre egy Bash-változót
CommonName
az Ubuntu-kiszolgáló DNS-nevére:CommonName=<Your Ubuntu Server DNS Name>
Ideiglenes munkamappa létrehozása:
mkdir -p ~/mosquitto_certs && cd ~/mosquitto_certs
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.
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
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
Olvasási hozzáférés biztosítása a kulcsokhoz:
sudo chmod a+r *.key
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.
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
Amikor a rendszer kéri, adja meg az e-mail-címét, és erősítse meg a használati feltételeket.
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.
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
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.
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
Frissítse a webes terminál konfigurációját:
- Indítsa el a Visual Studio Code-ot.
- A Visual Studio Code főmenüjében válassza a Fájl>megnyitása mappát.
- Nyissa meg a klónozott vagy letöltött Cloud-Enabled-Altair-on-Azure-Sphere mappát.
- Nyissa meg a Altair_Web_Terminal mappát.
- Kattintson a Mappa kiválasztása vagy az OK gombra a projekt megnyitásához.
- Nyissa meg az Altair webes terminál API-mappáját.
- Nyissa meg a local.settings.json fájlt.
- Frissítse a következő tulajdonságokat:
"MQTT_BROKER"
:"THE_DNS_NAME_OF_YOUR_VIRTUAL_MACHINE"
"MQTT_PASSWORD"
:"YOUR_WebTerminal_USERNAME_PASSWORD"
Töltse fel az Altair webes terminál helyi beállításait:
- Továbbra is a Visual Studio Code-ban válassza az F1 billentyűt.
- Í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.
- Válassza ki előfizetését.
- Válassza a Statikus webalkalmazás lehetőséget. A névhez írja be az AltairWebTerminal nevet.
- Válassza ki a környezetet az Éles környezet beállítással.
- A rendszer a meglévő beállítások felülírását kéri. Válassza az Igen mindenkinek lehetőséget.
Indítsa el a webes terminált, és válassza a Csatlakozás.
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:
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.
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/* .
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")
Mentse a altair_config.cmake fájlt. Ez a lépés automatikusan létrehozza a CMake-gyorsítótárat.
Frissítse a
AllowedConnections
app_manifest.json szakaszt a virtuális gép új tartománynevére. Távolítsa el a bejegyzésttest.mosquitto.org
, mert már nem fogja használni ezt a végpontot.Telepítse újra az Altair emulátort az Azure Sphere-be.
Ellenőrizze a webes terminált. Ekkor megjelenik az Altair emulátor kérése a MEMÓRIAMÉRET megadásához.
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
Állítsa le a Mosquitto Broker interaktív példányát a Ctrl+C billentyűkombinációval.
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
Írja be az alábbi parancsot:
sudo chmod 744 ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.sh
Másolja a Python virtuálislemez-kiszolgálót a /opt könyvtárba:
sudo cp -r ~/Altair8800Emulator/AltairPY_virtual_disk_server /opt/pyvdisk
Telepítse az indítási szolgáltatást:
sudo cp ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.service /etc/systemd/system
Egységek újrabetöltése
systemd
:sudo systemctl daemon-reload
Indítsa el a Python virtuális lemezszolgáltatást:
sudo systemctl start pyvdisk.service
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.
A virtuális gépen adja meg a következőt:
cd ~/mosquitto_certs
Í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