Cvičení – nasazení privátního zprostředkovatele MQTT

Dokončeno

V tomto cvičení se dozvíte, jak nainstalovat vlastního zprostředkovatele Mosquitto MQTT. Tato lekce je pokročilým tématem a předpokládá, že jste obeznámeni s Linuxem.

Privátního zprostředkovatele Mosquitto MQTT můžete spustit na virtuálním počítači Azure. Spuštění privátního zprostředkovatele MQTT vám pomůže bezpečně se připojit k Azure Sphere odkudkoli.

Zprávy MQTT mezi webovým terminálem a emulátorem Altair musí být podepsané a šifrované pomocí klientských certifikátů. Nejjednodušším a bezplatným způsobem vytvoření certifikátů TLS je vytvoření certifikátu certifikační autority podepsané svým držitelem (CA). Klíče klienta a certifikáty vytvoříte pomocí certifikátu certifikační autority podepsaného svým držitelem.

Instalace zprostředkovatele Mosquitto MQTT v Linuxu je nejjednodušší, protože většina správců balíčků obsahuje nejnovější buildy. Pomocí postupů v tomto cvičení nastavte virtuální počítač Azure s Ubuntu 20.04 LTS.

Poznámka:

Aby se minimalizovaly náklady, může být zprostředkovatel MQTT spuštěný na virtuálním počítači SKU Pro obecné účely B1, který se dá zastavit, když se nepoužívá.

Následující blogový příspěvek z K21 Academy je skvělý průvodce instalací serveru Ubuntu v Azure: Vytvoření a Připojení virtuálního počítače s Ubuntu v Azure.

Vytvoření virtuálního serveru Ubuntu

  1. Otevřete Azure Portal. V hlavní nabídce vyberte Vytvořit prostředek.
  2. Vyhledejte virtuální počítač a vyberte Vytvořit.
  3. Vytvořte skupinu prostředků, pojmenujte virtuální počítač a vyberte umístění. Pojmenujte image Ubuntu Server 20.04 LTS Gen 1 a nastavte velikost na Standard_B1ls – 1 vcpu, 0,5 GIB paměti. Vyberte veřejný klíč SSH a potom pojmenujte pár klíčů stejně jako název virtuálního počítače.
  4. Vyberte Další: Disky a pak vyberte Disky >HDD úrovně Standard nebo SSD úrovně Standard.
  5. Vyberte Zkontrolovat a vytvořit.
  6. Vyberte Vytvořit.
  7. Stáhněte si privátní klíč SSH a uložte ho do složky ~/.shh .

Nasazení virtuálního počítače trvá přibližně minutu.

Konfigurace virtuálního počítače

  1. Vyberte Přejít k prostředku.

  2. Vyberte název DNS, který není nakonfigurovaný. Potom nastavte název DNS a nastavte požadovanou hodnotu časového limitu nečinnosti. Doporučujeme zvýšit časový limit nečinnosti.

  3. Zvolte Uložit.

  4. Výběrem tlačítka Zpět prohlížeče se vraťte do podokna Přehled virtuálního počítače.

  5. Zkopírujte název DNS do Poznámkový blok, protože ho budete potřebovat při konfiguraci certifikátů.

  6. Výběrem podokna Sítě nastavte pravidla portů pro příchozí spojení pomocí tlačítka Přidat příchozí pravidlo portu. Přidejte následující pravidla:

    Cílový port Protokol Název Priorita Popis
    80 TCP Port_80 310 Pojďme zašifrovat prodloužení platnosti certifikátu
    8884 TCP Port_8884 311 Vyžaduje se MQTT, šifrovaný, klientský certifikát
    8091 TCP Port_8091 312 MQTT přes WebSockets, šifrované a ověřené

Povolení přístupu za běhu

  1. Vyberte podokno Konfigurace.
  2. Vyberte Povolit za běhu.

Připojení k virtuálnímu počítači z počítače

  1. Vyberte podokno Připojení.

  2. Nastavte zdrojová IP adresa na Moji IP adresu.

  3. Vyberte Požádat o přístup.

  4. Z plochy se připojte pomocí SSH k virtuálnímu počítači:

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

    První připojení může trvat minutu nebo dvě.

Konfigurace Ubuntu

  1. Použijte všechny aktualizace operačního systému:

    sudo apt update && sudo apt -y upgrade
    
  2. Nainstalujte požadovaný software:

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

Pomoc se zabezpečením zprostředkovatele Mosquitto MQTT

Následující kroky nastaví certifikáty, které pomáhají zabezpečit komunikaci mezi emulátorem Altair a webovým terminálem. Výsledkem bude certifikát podepsaný svým držitelem, který je platný po dobu dvou let (730 dnů).

  1. Vytvořte proměnnou Bash CommonName nastavenou na název DNS vašeho serveru Ubuntu:

    CommonName=<Your Ubuntu Server DNS Name>
    
  2. Vytvořte dočasnou pracovní složku:

    mkdir -p ~/mosquitto_certs && cd ~/mosquitto_certs
    
  3. Vytvořte certifikát certifikační autority podepsaný svým držitelem:

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

    Při vytváření certifikátu certifikační autority podepsaného svým držitelem můžete použít výchozí hodnotu, ale běžný název (CN) musí odpovídat názvu DNS vašeho serveru.

  4. Vytvořte certifikát serveru:

    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. Vygenerujte klientské certifikáty Mosquitto:

    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. Udělení přístupu pro čtení ke klíčům:

    sudo chmod a+r *.key
    
  7. Zkopírujte certifikáty do složky Mosquitto:

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

Instalace Let's Encrypt

Let's Encrypt je nezisková certifikační autorita, která poskytuje certifikáty TLS na 260 milionů webů. Použijeme bezplatný certifikát Let's Encrypt k zabezpečení zpráv MQTT mezi webovým terminálem a zprostředkovatelem Mosquitto MQTT.

Následující pokyny vás provedou instalací klienta Certbot ACME na server Ubuntu. Platnost certifikátů vydaných šifrováním vyprší po šesti měsících. Klient Certbot zajišťuje, aby se certifikáty aktualizovaly před vypršením jejich platnosti.

Další informace najdete v pokynech na webu Certbot.

  1. Zkopírujte a vložte následující blok příkazů do relace SSH a pak vyberte klávesu Enter :

    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. Po zobrazení výzvy zadejte svoji e-mailovou adresu a potvrďte podmínky a ujednání.

  3. Po zobrazení výzvy k zadání názvu domény serveru zadejte název domény, který jste zkopírovali do Poznámkový blok.

Proces instalace trvá přibližně pět minut. Po dokončení můžete otestovat, že proces obnovení funguje pomocí následujícího příkazu:

sudo certbot renew --dry-run

Certifikáty Let's Encrypt můžete zobrazit pomocí následujícího příkazu:

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

Vytvoření uživatelského jména a hesla pro webový terminál

Webový terminál použije certifikát Let's Encrypt k šifrování provozu MQTT přes internet. Webový terminál se také ověří pomocí zprostředkovatele MQTT pomocí uživatelského jména a hesla.

Následující příkaz vytvoří soubor hesla zprostředkovatele MQTT a zobrazí výzvu k zadání hesla pro uživatelské jméno WebTerminal :

sudo mosquitto_passwd -c /etc/mosquitto/passwd WebTerminal

Poznamenejte si uživatelské jméno a heslo, protože je budete potřebovat ke konfiguraci statické webové aplikace pro webový terminál.

Konfigurace zprostředkovatele Mosquitto MQTT

Zprostředkovateli Mosquitto musíte říct, jaké porty mají naslouchat a kde jsou certifikáty.

  1. Spuštěním následujícího příkazu zkopírujte následující konfiguraci do souboru /etc/mosquitto/conf.d/default.conf :

    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. Pomocí příkazu Linux sed aktualizujte zástupný symbol YOUR_DOMAIN_NAME názvem domény vašeho serveru:

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

Otestování moskvitového zprostředkovatele

Užitečný tip pro řešení potíží pro zprostředkovatele Mosquitto je začít v interaktivním režimu, aby se zajistilo, že neexistují žádné problémy.

  1. Nejprve musíte zastavit Mosquitto a pak spustit v interaktivním režimu. Stisknutím kombinace kláves Ctrl+C ukončete interaktivní režim Mosquitto a zadejte následující příkaz:

    sudo systemctl stop mosquitto && sudo mosquitto -c /etc/mosquitto/conf.d/default.conf
    
  2. Aktualizujte konfiguraci webového terminálu:

    1. Spusťte Visual Studio Code.
    2. V hlavní nabídce editoru Visual Studio Code vyberte složku Otevřít soubor>.
    3. Otevřete složku Cloud-Enabled-Altair-on-Azure-Sphere, kterou jste naklonovali nebo stáhli.
    4. Otevřete složku Altair_Web_Terminal.
    5. Kliknutím na Vybrat složku nebo na tlačítko OK otevřete projekt.
    6. Přejděte do složky api webového terminálu Altair.
    7. Otevřete soubor local.settings.json.
    8. Aktualizujte tyto vlastnosti:
      • "MQTT_BROKER": "THE_DNS_NAME_OF_YOUR_VIRTUAL_MACHINE"
      • "MQTT_PASSWORD": "YOUR_WebTerminal_USERNAME_PASSWORD"
  3. Nahrajte místní nastavení webového terminálu Altair:

    1. V editoru Visual Studio Code vyberte klávesu F1 .
    2. Zadejte statický místní a pak vyberte Azure Static Web Apps: Nahrát místní Nastavení.
    3. Vyberte své předplatné.
    4. Vyberte statickou webovou aplikaci. Jako název zadejte AltairWebTerminal.
    5. Vyberte prostředí zadáním příkazu Production (Produkční).
    6. Zobrazí se výzva k přepsání existujícího nastavení. Vyberte Ano pro všechny.
  4. Spusťte webový terminál a vyberte Připojení.

  5. Podívejte se na interaktivní výstup zprostředkovatele Mosquitto. Měl by vypadat podobně jako v následujícím výstupu:

    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').
    

Aktualizace konfigurace emulátoru Altair

Aktualizujte emulátor Altair a připojte se k novému zprostředkovateli Mosquitto MQTT:

  1. Zkopírujte novou certifikační autoritu a klientské certifikáty do složky certifikátů emulátoru Altair. Nejjednodušší způsob je z Průzkumníka souborů. Přejděte do složky certs a otevřete nový terminál nebo okno PowerShellu.

  2. Spuštěním scp příkazu zkopírujte certifikáty z virtuálního počítače Mosquitto do složky certs . Následující příkaz předpokládá, že jste zkopírovali privátní klíč virtuálního počítače do složky ~/.ssh :

    scp -i ~/.ssh/<your_private_key>.pem <username>@<host_dns_name>:~/mosquitto_certs/* .
    
  3. Otevřete projekt emulátoru Altair v editoru Visual Studio Code. Aktualizujte definici ALTAIR_MQTT_HOST v souboru cmake/altair_config.cmake názvem DNS vašeho zprostředkovatele Mosquitto:

    add_compile_definitions(ALTAIR_MQTT_HOST="REPLACE_WITH_YOUR_VIRTUAL_MACHINE_DNS_NAME")    
    
  4. Uložte soubor altair_config.cmake. Tento krok automaticky vygeneruje mezipaměť CMake.

  5. AllowedConnections Aktualizujte část souboru app_manifest.json na nový název domény virtuálního počítače. Odeberte položku pro test.mosquitto.org, protože už tento koncový bod nebudete používat.

  6. Znovu nasaďte emulátor Altair do Azure Sphere.

  7. Zkontrolujte webový terminál. Měla by se zobrazit výzva k zadání VELIKOSTI PAMĚTI v emulátoru Altair.

  8. Zkontrolujte výstup zprostředkovatele Mosquitto spuštěného v interaktivním režimu. Měl by vypadat podobně jako následující kód:

    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').
    
    

Spuštění zprostředkovatele Mosquitto MQTT v režimu démona

  1. Zastavte interaktivní instanci zprostředkovatele Mosquitto tak, že vyberete Ctrl+C.

  2. Spusťte zprostředkovatele Mosquitto v režimu démona:

    sudo systemctl enable mosquitto && sudo systemctl start mosquitto
    

Spuštění serveru virtuálního disku Pythonu na virtuálním počítači

Spuštění virtuálního diskového serveru Pythonu na virtuálním počítači výrazně zvýší výkon, protože eliminuje odezvu serveru MQTT z plochy.

Naklonujte projekt Altair do virtuálního počítače:

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

Automatické spuštění virtuálního diskového serveru

  1. Zadejte tento příkaz:

    sudo chmod 744 ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.sh
    
  2. Zkopírujte virtuální diskový server Pythonu do adresáře /opt :

    sudo cp -r ~/Altair8800Emulator/AltairPY_virtual_disk_server /opt/pyvdisk
    
  3. Nainstalujte spouštěcí službu:

    sudo cp ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.service /etc/systemd/system
    
  4. Jednotky opětovného načtení systemd :

    sudo systemctl daemon-reload
    
  5. Spusťte virtuální diskovou službu Pythonu:

    sudo systemctl start pyvdisk.service
    
  6. Zkontrolujte stav služby virtuálního disku Pythonu:

    sudo systemctl status pyvdisk.service
    

Odstranění potíží

Nástroje mosquitto_pub a mosquitto_sub nástroje jsou užitečné pro testování certifikátů.

  1. Na virtuálním počítači zadejte:

    cd ~/mosquitto_certs
    
  2. Zadejte tento příkaz:

    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
    

    Pokud mosquitto_pub selže, zobrazí se chybová zpráva. Nejpravděpodobnější příčinou je, že běžný název certifikační autority neodpovídá plně kvalifikovanému názvu domény vašeho virtuálního počítače.

Testování certifikátů na serveru

Zadejte následující blok příkazu:

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