Alıştırma - Özel bir MQTT aracısı dağıtma

Tamamlandı

Bu alıştırmada kendi Mosquitto MQTT aracınızı yüklemeyi öğreneceksiniz. Bu ünite gelişmiş bir konudur ve Linux konusunda rahat olduğunuzu varsayar.

Azure sanal makinesinde özel bir Mosquitto MQTT aracısı çalıştırabilirsiniz. Özel bir MQTT aracısı çalıştırmak, Azure Sphere'a her yerden güvenli bir şekilde bağlanmanıza yardımcı olur.

Web terminali ile Altair öykünücüsü arasındaki MQTT iletilerinin istemci sertifikalarıyla imzalanması ve şifrelenmeleri gerekir. TLS sertifikaları oluşturmanın en kolay ve ücretsiz yolu, otomatik olarak imzalanan bir sertifika yetkilisi (CA) sertifikası oluşturmaktır. otomatik olarak imzalanan CA sertifikasını kullanarak istemci anahtarları ve sertifikaları oluşturursunuz.

Çoğu paket yöneticisinin en son derlemeleri içerdiğinden En kolay seçenek, Mosquitto MQTT aracısını Linux'a yüklemektir. Ubuntu 20.04 LTS çalıştıran bir Azure sanal makinesi ayarlamak için bu alıştırmadaki yordamları kullanın.

Dekont

Maliyetleri en aza indirmek için, MQTT aracısı kullanılmadığında durdurulabilen Genel amaçlı B1 SKU sanal makinesinde çalıştırılabilir.

K21 Academy'nin aşağıdaki blog gönderisi, Azure'da Ubuntu sunucusu yüklemeye yönelik harika bir kılavuzdur: Azure'da Ubuntu Sanal Makinesi oluşturma ve Bağlan.

Ubuntu sanal sunucusu oluşturma

  1. Azure portalını açın. Ana menüden Kaynak oluştur'u seçin.
  2. Sanal makine için arama yapın ve Oluştur'u seçin.
  3. Bir kaynak grubu oluşturun, sanal makinenizi adlandırıp bir konum seçin. Görüntüyü Ubuntu Server 20.04 LTS 1. Nesil olarak adlandırın ve boyutu Standard_B1ls - 1 vcpu, 0,5 GIB bellek olarak ayarlayın. SSH ortak anahtarı'nı seçin ve anahtar çiftinizi sanal makinenizin adıyla aynı şekilde adlandırın.
  4. İleri: Diskler'i >ve ardından Standart HDD veya Standart SSD LRS'yi seçin.
  5. Gözden geçir ve oluştur’u seçin.
  6. Create'u seçin.
  7. SSH özel anahtarını indirin ve ~/.shh klasörünüzde depolayın.

Sanal makinenin dağıtılması yaklaşık bir dakika sürer.

Sanal makineyi yapılandırma

  1. Kaynağa git’i seçin.

  2. DNS adı yapılandırılmadı'ı seçin. Ardından DNS adını ayarlayın ve istediğiniz boşta kalma zaman aşımı değerini ayarlayın. Boşta kalma zaman aşımını artırmanızı öneririz.

  3. Kaydet'i seçin.

  4. Sanal makinenin Genel Bakış bölmesine dönmek için tarayıcınızın Geri düğmesini seçin.

  5. Sertifikaları yapılandırırken ihtiyacınız olduğundan DNS adını Not Defteri kopyalayın.

  6. Gelen bağlantı noktası kuralı ekle düğmesini kullanarak gelen bağlantı noktası kurallarını ayarlamak için Ağ bölmesini seçin. Aşağıdaki kuralları ekleyin:

    Hedef bağlantı noktası Protokol Veri Akışı Adı Öncelik Tanım
    80 TCP Port_80 310 Sertifika yenilemeyi şifreleyelim
    8884 TCP Port_8884 311 MQTT, şifrelenmiş, istemci sertifikası gerekiyor
    8091 TCP Port_8091 312 WebSockets üzerinden MQTT, şifrelenmiş, kimliği doğrulanmış

Tam zamanında erişimi etkinleştirme

  1. Yapılandırma bölmesini seçin.
  2. Tam zamanında etkinleştir'i seçin.

Masaüstünüzden sanal makineye Bağlan

  1. Bağlan bölmesini seçin.

  2. Kaynak IP'yi Ip'm olarak ayarlayın.

  3. Erişim iste'yi seçin.

  4. Masaüstünüzden SSH'den sanal makineye:

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

    İlk kez bağlandığınızda bir veya iki dakika sürebilir.

Ubuntu'u yapılandırma

  1. tüm işletim sistemi güncelleştirmelerini uygulayın:

    sudo apt update && sudo apt -y upgrade
    
  2. Gerekli yazılımları yükleyin:

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

Mosquitto MQTT aracısının güvenliğini sağlamaya yardımcı olun

Aşağıdaki adımlar, Altair öykünücüsü ile web terminali arasındaki iletişimin güvenliğini sağlamaya yardımcı olmak için sertifikaları ayarlar. Sonuç, iki yıl (730 gün) için geçerli olan otomatik olarak imzalanan bir sertifika olacaktır.

  1. Ubuntu sunucunuzun DNS adına ayarlanmış bir Bash CommonName değişkeni oluşturun:

    CommonName=<Your Ubuntu Server DNS Name>
    
  2. Geçici bir çalışma klasörü oluşturun:

    mkdir -p ~/mosquitto_certs && cd ~/mosquitto_certs
    
  3. Otomatik olarak imzalanan CA sertifikasını oluşturun:

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

    Otomatik olarak imzalanan bir CA sertifikası oluştururken varsayılan değeri kullanabilirsiniz, ancak ortak adın (CN) sunucunuzun DNS adıyla eşleşmesi gerekir .

  4. Sunucu sertifikasını oluşturun:

    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. Mosquitto istemci sertifikalarını oluşturun:

    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. Anahtarlara okuma erişimi verin:

    sudo chmod a+r *.key
    
  7. Sertifikaları Mosquitto klasörüne kopyalayın:

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

Let's Encrypt'i yükleme

Let's Encrypt , 260 milyon web sitesine TLS sertifikaları sağlayan kar amacı gütmeyen bir sertifika yetkilisidir. Web terminali ile Mosquitto MQTT aracısı arasındaki MQTT iletilerinin güvenliğini sağlamaya yardımcı olmak için ücretsiz bir Let's Encrypt sertifikası kullanacağız.

Aşağıdaki yönergeler, Ubuntu sunucusuna Certbot ACME istemcisini yükleme konusunda size yol gösterir. Şifreleme ile verilen sertifikaların süresinin altı ay sonra dolmasına izin verelim. Certbot istemcisi sertifikaların süresi dolmadan önce güncelleştirilmesini sağlar.

Daha fazla bilgi için Certbot sitesindeki yönergelere bakın.

  1. Aşağıdaki komut bloğunu kopyalayıp SSH oturumuna yapıştırın ve enter tuşunu seçin:

    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. İstendiğinde e-posta adresinizi girin ve hüküm ve koşulları onaylayın.

  3. Sunucunuzun etki alanı adı istendiğinde, Not Defteri kopyaladığınız etki alanı adını girin.

Yükleme işlemi yaklaşık beş dakika sürer. tamamlandığında, aşağıdaki komutu kullanarak yenileme işleminin çalışıp çalışmadığını test edebilirsiniz:

sudo certbot renew --dry-run

Aşağıdaki komutu kullanarak Let's Encrypt sertifikalarını görüntüleyebilirsiniz:

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

Web terminali için kullanıcı adı ve parola oluşturma

Web terminali, İnternet üzerinden MQTT trafiğini şifrelemek için Let's Encrypt sertifikasını kullanır. Web terminali ayrıca kullanıcı adı ve parolayı kullanarak MQTT aracısı ile kimlik doğrulaması yapar.

Aşağıdaki komut MQTT aracısının parola dosyasını oluşturur ve WebTerminal kullanıcı adı için bir parola girmenizi ister:

sudo mosquitto_passwd -c /etc/mosquitto/passwd WebTerminal

Web terminali için statik web uygulamasını yapılandırmaları gerekmediğinden kullanıcı adı ve parolayı not edin.

Mosquitto MQTT aracısını yapılandırma

Mosquitto aracısına dinlemesi gereken bağlantı noktalarını ve sertifikaların nerede olduğunu söylemeniz gerekir.

  1. Aşağıdaki yapılandırmayı /etc/mosquitto/conf.d/default.conf dosyasına kopyalamak için aşağıdaki komutu çalıştırın:

    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. Linux sed komutunu kullanarak YOUR_DOMAIN_NAME yer tutucusunu sunucunuzun etki alanı adıyla güncelleştirin:

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

Mosquitto aracısını test edin

Mosquitto aracısı için yararlı bir sorun giderme ipucu, herhangi bir sorun olmadığından emin olmak için etkileşimli modda başlamaktır.

  1. Önce Mosquitto'yu durdurmanız ve ardından etkileşimli modda başlamanız gerekir. Mosquitto etkileşimli modundan çıkmak için Ctrl+C tuşlarına basın ve aşağıdaki komutu girin:

    sudo systemctl stop mosquitto && sudo mosquitto -c /etc/mosquitto/conf.d/default.conf
    
  2. Web terminali yapılandırmasını güncelleştirin:

    1. Visual Studio Code’u başlatın.
    2. Visual Studio Code ana menüsünden Dosya>Aç klasörünü seçin.
    3. Kopyaladığınız veya indirdiğiniz Cloud-Enabled-Altair-on-Azure-Sphere klasörünü açın.
    4. Altair_Web_Terminal klasörünü açın.
    5. Projeyi açmak için Klasör Seç’e veya Tamam düğmesine tıklayın.
    6. Altair web terminalinin api klasörüne gidin.
    7. local.settings.json dosyasını açın.
    8. Şu özellikleri güncelleştirin:
      • "MQTT_BROKER": "THE_DNS_NAME_OF_YOUR_VIRTUAL_MACHINE"
      • "MQTT_PASSWORD": "YOUR_WebTerminal_USERNAME_PASSWORD"
  3. Altair web terminalinin yerel ayarlarını karşıya yükleyin:

    1. Hala Visual Studio Code'da F1 tuşunu seçin.
    2. Statik yerel yazın ve Ardından Azure Statik Web Uygulamaları: Yerel Ayarlar Karşıya Yükle'yi seçin.
    3. Aboneliğinizi seçin.
    4. Statik Web Uygulaması'ı seçin. Ad olarak AltairWebTerminal girin.
    5. Üretim'i girerek ortamı seçin.
    6. Mevcut ayarların üzerine yazmanız istenir. Tümüne evet'i seçin.
  4. Web terminalini başlatın ve Bağlan'ı seçin.

  5. Mosquitto aracısının etkileşimli çıkışını gözlemleyin. Aşağıdaki çıkışa benzer görünmelidir:

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

Altair öykünücüsü yapılandırmasını güncelleştirme

Altair öykünücüsünüzü yeni Mosquitto MQTT aracınıza bağlanacak şekilde güncelleştirin:

  1. Yeni CA ve istemci sertifikalarını Altair öykünücüsün sertifikalar klasörüne kopyalayın. En kolay yol dosya gezginindendir. certs klasörüne göz atın ve yeni bir terminal veya PowerShell penceresi açın.

  2. scp Mosquitto sanal makinenizdeki sertifikaları certs klasörüne kopyalamak için komutunu çalıştırın. Aşağıdaki komut, sanal makinenizin özel anahtarını ~/.ssh klasörüne kopyaladığınız varsayılır:

    scp -i ~/.ssh/<your_private_key>.pem <username>@<host_dns_name>:~/mosquitto_certs/* .
    
  3. Visual Studio Code'da Altair öykünücüsü projesini açın. ALTAIR_MQTT_HOST cmake/altair_config.cmake dosyasındaki tanımı Mosquitto aracınızın DNS adıyla güncelleştirin:

    add_compile_definitions(ALTAIR_MQTT_HOST="REPLACE_WITH_YOUR_VIRTUAL_MACHINE_DNS_NAME")    
    
  4. altair_config.cmake dosyasını kaydedin. Bu adım CMake önbelleğini otomatik olarak oluşturur.

  5. AllowedConnections app_manifest.json dosyasının bölümünü sanal makinenin yeni etki alanı adıyla güncelleştirin. artık bu uç noktayı kullanmayacağından için test.mosquitto.orggirdisini kaldırın.

  6. Altair öykünücüsünüzü Azure Sphere'a yeniden dağıtın.

  7. Web terminalini denetleyin. BELLEK BOYUTU girmek için Altair öykünücüsü istemini görmeniz gerekir.

  8. Etkileşimli modda çalışan Mosquitto aracısının çıkışını denetleyin. Aşağıdaki koda benzer görünmelidir:

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

Mosquitto MQTT aracısını daemon modunda başlatma

  1. Ctrl+C tuşlarına basarak Mosquitto Aracısı'nın etkileşimli örneğini durdurun.

  2. Mosquitto aracısını daemon modunda başlatın:

    sudo systemctl enable mosquitto && sudo systemctl start mosquitto
    

Sanal makinede Python sanal disk sunucusunu çalıştırma

Python sanal disk sunucusunun sanal makinede çalıştırılması, masaüstünüzden MQTT sunucusuna gidiş dönüş işlemini ortadan kaldırdığından performansı önemli ölçüde artırır.

Altair projesini sanal makineye kopyalayın:

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

Sanal disk sunucusunu otomatik olarak başlatma

  1. Aşağıdaki komutu girin:

    sudo chmod 744 ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.sh
    
  2. Python sanal disk sunucusunu /opt dizinine kopyalayın:

    sudo cp -r ~/Altair8800Emulator/AltairPY_virtual_disk_server /opt/pyvdisk
    
  3. Başlangıç hizmetini yükleyin:

    sudo cp ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.service /etc/systemd/system
    
  4. Birimleri yeniden yükleme systemd :

    sudo systemctl daemon-reload
    
  5. Python sanal disk hizmetini başlatın:

    sudo systemctl start pyvdisk.service
    
  6. Python sanal disk hizmetinin durumunu denetleyin:

    sudo systemctl status pyvdisk.service
    

Sorun giderme

mosquitto_pub ve mosquitto_sub araçları sertifikaları test etmede kullanışlıdır.

  1. Sanal makineye şunu girin:

    cd ~/mosquitto_certs
    
  2. Aşağıdaki komutu girin:

    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
    

    Başarısız olursa mosquitto_pub bir hata iletisi görüntülenir. Bunun en olası nedeni, CA ortak adının sanal makinenizin tam etki alanı adıyla eşleşmemesidir.

Sertifikalarınızı sunucuda test edin

Aşağıdaki komut bloğunu girin:

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