Alıştırma - Özel bir MQTT aracısı dağıtma
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
- Azure portalını açın. Ana menüden Kaynak oluştur'u seçin.
- Sanal makine için arama yapın ve Oluştur'u seçin.
- 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.
- İleri: Diskler'i >ve ardından Standart HDD veya Standart SSD LRS'yi seçin.
- Gözden geçir ve oluştur’u seçin.
- Create'u seçin.
- 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
Kaynağa git’i seçin.
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.
Kaydet'i seçin.
Sanal makinenin Genel Bakış bölmesine dönmek için tarayıcınızın Geri düğmesini seçin.
Sertifikaları yapılandırırken ihtiyacınız olduğundan DNS adını Not Defteri kopyalayın.
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
- Yapılandırma bölmesini seçin.
- Tam zamanında etkinleştir'i seçin.
Masaüstünüzden sanal makineye Bağlan
Bağlan bölmesini seçin.
Kaynak IP'yi Ip'm olarak ayarlayın.
Erişim iste'yi seçin.
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
tüm işletim sistemi güncelleştirmelerini uygulayın:
sudo apt update && sudo apt -y upgrade
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.
Ubuntu sunucunuzun DNS adına ayarlanmış bir Bash
CommonName
değişkeni oluşturun:CommonName=<Your Ubuntu Server DNS Name>
Geçici bir çalışma klasörü oluşturun:
mkdir -p ~/mosquitto_certs && cd ~/mosquitto_certs
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 .
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
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
Anahtarlara okuma erişimi verin:
sudo chmod a+r *.key
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.
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
İstendiğinde e-posta adresinizi girin ve hüküm ve koşulları onaylayın.
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.
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
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.
Ö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
Web terminali yapılandırmasını güncelleştirin:
- Visual Studio Code’u başlatın.
- Visual Studio Code ana menüsünden Dosya>Aç klasörünü seçin.
- Kopyaladığınız veya indirdiğiniz Cloud-Enabled-Altair-on-Azure-Sphere klasörünü açın.
- Altair_Web_Terminal klasörünü açın.
- Projeyi açmak için Klasör Seç’e veya Tamam düğmesine tıklayın.
- Altair web terminalinin api klasörüne gidin.
- local.settings.json dosyasını açın.
- Şu özellikleri güncelleştirin:
"MQTT_BROKER"
:"THE_DNS_NAME_OF_YOUR_VIRTUAL_MACHINE"
"MQTT_PASSWORD"
:"YOUR_WebTerminal_USERNAME_PASSWORD"
Altair web terminalinin yerel ayarlarını karşıya yükleyin:
- Hala Visual Studio Code'da F1 tuşunu seçin.
- Statik yerel yazın ve Ardından Azure Statik Web Uygulamaları: Yerel Ayarlar Karşıya Yükle'yi seçin.
- Aboneliğinizi seçin.
- Statik Web Uygulaması'ı seçin. Ad olarak AltairWebTerminal girin.
- Üretim'i girerek ortamı seçin.
- Mevcut ayarların üzerine yazmanız istenir. Tümüne evet'i seçin.
Web terminalini başlatın ve Bağlan'ı seçin.
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:
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.
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/* .
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")
altair_config.cmake dosyasını kaydedin. Bu adım CMake önbelleğini otomatik olarak oluşturur.
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çintest.mosquitto.org
girdisini kaldırın.Altair öykünücüsünüzü Azure Sphere'a yeniden dağıtın.
Web terminalini denetleyin. BELLEK BOYUTU girmek için Altair öykünücüsü istemini görmeniz gerekir.
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
Ctrl+C tuşlarına basarak Mosquitto Aracısı'nın etkileşimli örneğini durdurun.
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
Aşağıdaki komutu girin:
sudo chmod 744 ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.sh
Python sanal disk sunucusunu /opt dizinine kopyalayın:
sudo cp -r ~/Altair8800Emulator/AltairPY_virtual_disk_server /opt/pyvdisk
Başlangıç hizmetini yükleyin:
sudo cp ~/Altair8800Emulator/AltairPY_virtual_disk_server/pyvdisk.service /etc/systemd/system
Birimleri yeniden yükleme
systemd
:sudo systemctl daemon-reload
Python sanal disk hizmetini başlatın:
sudo systemctl start pyvdisk.service
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.
Sanal makineye şunu girin:
cd ~/mosquitto_certs
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