MQTT Güvenliği

MQTT İçin Self-Signed Sertifika Kurulumu: Ne Zaman ve Nasıl Kullanılır?

OpenSSL ile özel bir sertifika otoritesi oluşturma, bir laboratuvar Mosquitto broker'ını 8883 portunda güvenceye alma ve istemcileri bağlama üzerine uygulamalı bir rehber; ayrıca üretimde herkese açık sertifikaları daha kolay kılan operasyonel maliyetler.

Laboratuvar ağı için bir broker sertifikasını imzalayan özel sertifika otoritesini gösteren MQTT self-signed sertifika çizimi
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

MQTT için self-signed (kendinden imzalı) bir sertifika, herkese açık bir sertifika otoritesine ihtiyaç duymadan bir laboratuvar veya çevrimdışı broker'ı şifrelemenizi sağlar. Özensiz yapıldığında ya her istemcide doğrulama başarısız olur ya da insanlar doğrulamayı tamamen kapatmaya yönelir. Bu rehber doğru yöntemi, yani OpenSSL ile oluşturulan küçük bir özel CA'yı gösteriyor; ardından Mosquitto'yu 8883 portunda yapılandırıyor, Python ve komut satırı istemcilerini bağlıyor ve herkese açık güvenilen bir sertifikanın sizi ne zaman bu zahmetten kurtardığını açıklıyor.

Self-Signed Sertifika mı, Özel CA mı?

"Self-signed sertifika" ifadesi iki farklı kurulum için kullanılır:

  • Tek bir self-signed sunucu sertifikası: broker'ın sertifikası kendi kendini imzalar. İstemciler tam olarak o sertifikaya güvenmek zorundadır. Sertifikanın süresi dolduğunda veya değiştiğinde her istemcinin güncellenmesi gerekir.
  • Özel bir CA: kendi kök CA sertifikanızı (self-signed) oluşturur ve broker sertifikasını onunla imzalarsınız. İstemciler CA'ya güvenir; böylece CA aynı kaldığı sürece broker sertifikasını özgürce yeniden düzenleyebilirsiniz.

Neredeyse her durumda istediğiniz şey özel CA yaklaşımıdır. İki ek OpenSSL komutuna mal olur ve sunucu sertifikası her değiştiğinde güveni yeniden dağıtma zahmetinden sizi kurtarır.

MQTT İçin Self-Signed Sertifika Ne Zaman Mantıklıdır?

Senaryo Self-signed / özel CA Herkese açık güvenilen sertifika
Dizüstü veya laboratuvar testi Uygun Mümkün ama gereksiz
İnternetten yalıtılmış fabrika ağı, herkese açık DNS yok Çoğu zaman tek seçenek Herkese açık DNS olmadan mümkün değil
IP veya .local adıyla erişilen dahili broker Uygulanabilir Herkese açık CA'lar bu adlar için sertifika veremez
Cihazlar ve uygulamalar için internete açık broker Kaçının Kesinlikle tercih edilir
WSS üzerinden tarayıcı panoları Zahmetli (tarayıcı uyarıları) Kutudan çıktığı gibi çalışır
Kontrol etmediğiniz üçüncü taraf istemciler Zahmetli (CA'nızı kurmaları gerekir) Kutudan çıktığı gibi çalışır

Adım 1: Özel CA'yı Oluşturun

Bir çalışma dizini ile bir CA anahtarı ve sertifikası oluşturun. ca.key dosyasını koruyun: ona sahip olan herkes broker'ınızı taklit edebilir.

mkdir -p ~/mqtt-ca && cd ~/mqtt-ca

openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
  -subj "/O=Example Lab/CN=Example Lab MQTT CA" -out ca.crt

Adım 2: SAN İçeren Broker Sertifikasını Oluşturun

Modern TLS istemcileri hostname kontrolünde sertifikanın common name alanını yok sayar ve yalnızca Subject Alternative Name (SAN) alanına bakar. SAN'ı atlamak, self-signed MQTT kurulumunun doğrulamada başarısız olmasının en yaygın nedenidir. İstemcilerin kullanacağı her adı ve IP adresini ekleyin.

openssl genrsa -out broker.key 2048
openssl req -new -key broker.key \
  -subj "/O=Example Lab/CN=mqtt.lab.local" -out broker.csr

cat > broker.ext <<'EOF'
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = DNS:mqtt.lab.local, DNS:localhost, IP:192.168.1.50
EOF

openssl x509 -req -in broker.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -days 397 -sha256 -extfile broker.ext -out broker.crt

Kullanmadan önce sonucu kontrol edin:

openssl x509 -in broker.crt -noout -subject -issuer -dates -ext subjectAltName
openssl verify -CAfile ca.crt broker.crt

İkinci komut broker.crt: OK çıktısını vermelidir. Adları ve IP adresini kendi değerlerinizle değiştirin.

Adım 3: Mosquitto'yu TLS İçin Yapılandırın

Dosyaları broker'a kopyalayın ve bir listener yapılandırması oluşturun:

sudo mkdir -p /etc/mosquitto/certs
sudo cp ca.crt broker.crt broker.key /etc/mosquitto/certs/
sudo chown mosquitto: /etc/mosquitto/certs/broker.key
sudo chmod 600 /etc/mosquitto/certs/broker.key
# /etc/mosquitto/conf.d/tls.conf
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/broker.crt
keyfile /etc/mosquitto/certs/broker.key

# MQTT kimlik bilgilerini de zorunlu kıl
allow_anonymous false
password_file /etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd labuser ile bir kullanıcı oluşturun, ardından sudo systemctl restart mosquitto ile yeniden başlatın ve okunamayan anahtar dosyaları gibi hatalar için journalctl -u mosquitto çıktısını kontrol edin.

Adım 4: İstemcileri Bağlayın

Her istemcinin ca.crt dosyasına ihtiyacı vardır; CA anahtarına asla. mosquitto araçlarıyla:

mosquitto_sub -h mqtt.lab.local -p 8883 --cafile ca.crt \
  -u labuser -P 'your-password' -i lab-sub-1 -t "lab/#" -v

mosquitto_pub -h mqtt.lab.local -p 8883 --cafile ca.crt \
  -u labuser -P 'your-password' -i lab-pub-1 -t "lab/test" -m "hello private CA"

paho-mqtt 2.x ile Python'da:

import paho.mqtt.client as mqtt

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="lab-python-1")
client.tls_set(ca_certs="ca.crt")          # yalnızca özel CA'ya güven
client.username_pw_set("labuser", "your-password")
client.connect("mqtt.lab.local", 8883)
client.loop_start()
client.publish("lab/test", "verified against private CA", qos=1).wait_for_publish()
client.loop_stop()
client.disconnect()

Node.js'te MQTT.js seçeneklerine ca: fs.readFileSync("ca.crt") ekleyin. ESP32'de ca.crt içeriğini gömün ve setCACert() çağırın. Her örnekte doğrulamanın tamamen etkin kaldığına dikkat edin: istemci yalnızca herkese açık bir CA yerine sizin CA'nıza güvenir. Doğrulama hatalarıyla karşılaşırsanız MQTT'de SSL CERTIFICATE_VERIFY_FAILED rehberimiz olağan nedenleri listeler.

Özel CA'ya Sistem Genelinde Güvenmek

Laboratuvar makinelerinde her araca --cafile geçirmek zamanla can sıkıcı hâle gelir. Bir Linux iş istasyonunda CA'yı işletim sistemi deposuna ekleyebilirsiniz; böylece bu depoyu kullanan mosquitto_sub --capath /etc/ssl/certs, curl ve çoğu dil çalışma zamanı gibi araçlar laboratuvar broker'ına otomatik olarak güvenir:

# Debian / Ubuntu / Raspberry Pi OS
sudo cp ca.crt /usr/local/share/ca-certificates/example-lab-mqtt-ca.crt
sudo update-ca-certificates

Windows'ta yönetici yetkili bir komut isteminden certutil -addstore -f Root ca.crt ile ca.crt dosyasını "Güvenilen Kök Sertifika Yetkilileri" deposuna aktarın; macOS'ta ise System anahtar zincirine ekleyip güvenilir olarak işaretleyin. Bunu bilinçli yapın. Laboratuvar CA'nızın imzaladığı her şey, yalnızca MQTT için değil her amaçla o makine tarafından güvenilir hâle gelir; bu yüzden CA anahtarını buna göre koruyun ve laboratuvardan ayrılan makinelerden CA'yı kaldırın. certifi tabanlı Python istemcilerinin ve Node.js'in, aksi yapılandırılmadıkça işletim sistemi deposunu yok saydığını unutmayın; bu nedenle onların hâlâ CA dosyasına ihtiyacı vardır.

Kaçınılması Gereken Tuzaklar

  1. Eksik SAN: zincir geçerli olsa bile hostname doğrulaması başarısız olur.
  2. Yanlış dosyayı dağıtmak: istemcilerin broker.crt değil ca.crt dosyasına ihtiyacı vardır; ca.key ise asla dağıtılmaz.
  3. Doğrulamayı kapatmak: --insecure, tls_insecure_set(True) veya rejectUnauthorized: false sertifikayı anlamsız kılar.
  4. Son kullanma tarihini unutmak: broker sertifikasının bitiş tarihini takvime yazın ve mümkünse yenilemeyi otomatikleştirin. Süresi dolmuş bir sertifika tüm istemcileri aynı anda çevrimdışı bırakır.
  5. Sunucu sertifikasında aşırı uzun geçerlilik: uzun ömürlü sertifikalar kullanışlıdır ama sızan bir anahtarın etkisini artırır. CA'yı uzun ömürlü, broker sertifikasını daha kısa tutun.
  6. CA anahtarının broker'da bulunması: CA anahtarını çevrimdışı saklayın. Broker'ın yalnızca kendi anahtarına ve sertifikasına ihtiyacı vardır.
  7. Saat sorunları: doğru zamana sahip olmayan cihazlar geçerli sertifikaları reddeder.

Karşılıklı TLS istiyorsanız aynı özel CA istemci sertifikalarını da imzalayabilir; bkz. X.509 istemci sertifikalarıyla MQTT mTLS.

Broker Sertifikasını Yenilemek

Özel CA aynı kaldığı için yenileme yalnızca broker'ı etkiler. Yeni bir anahtar oluşturun (politikanız izin veriyorsa eskisini yeniden kullanın), yeni bir CSR hazırlayın, aynı CA ve broker.ext dosyasıyla imzalayın ve broker'daki dosyaları değiştirin:

openssl genrsa -out broker-new.key 2048
openssl req -new -key broker-new.key -subj "/O=Example Lab/CN=mqtt.lab.local" -out broker-new.csr
openssl x509 -req -in broker-new.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -days 397 -sha256 -extfile broker.ext -out broker-new.crt

sudo cp broker-new.crt /etc/mosquitto/certs/broker.crt
sudo cp broker-new.key /etc/mosquitto/certs/broker.key
sudo systemctl restart mosquitto

İstemciler değişmez, çünkü broker sertifikasına değil ca.crt dosyasına güvenirler. Her istemcinin yeni dosyaya ihtiyaç duyacağı tek başına bir self-signed sertifikaya kıyasla özel CA yönteminin getirisi budur. Bitişten bir ay önce sizi uyaran basit bir cron görevi eklemeye değer:

openssl x509 -checkend 2592000 -noout -in /etc/mosquitto/certs/broker.crt \
  || echo "MQTT broker certificate expires within 30 days"

Kimsenin Bahsetmediği Operasyonel Maliyet

Özel bir CA ilk gün kolaydır. Maliyet daha sonra ortaya çıkar: ca.crt dosyasını her yeni istemciye dağıtmak, biri WSS panosu açtığında tarayıcı uyarılarını açıklamak, broker sertifikasını süresi dolmadan yenilemek, on yıl sonra veya anahtar ele geçirildiğinde CA'nın kendisini değiştirmek ve tüm bunları bir sonraki mühendis için belgelemek. İnternete açık bir sistem için bu çaba, herkese açık güvenilen bir sertifikanın zaten sağlamadığı hiçbir şey kazandırmaz.

Üretim için yönetilen bir MQTT broker kullanmanın temel nedeni budur. ConnectMQ, işletim sistemlerinin, tarayıcıların, Python ve Node.js'in zaten güvendiği bir Let's Encrypt sertifikası sunar ve bunu otomatik olarak yeniler. İstemciler, mikrodenetleyicilere standart bir herkese açık kök sertifika gömmek dışında hiçbir CA dosyası dağıtmadan 8883 portuna veya 8084 portundaki güvenli WebSocket'e bağlanır. Bunu ücretsiz herkese açık MQTT broker üzerinde saniyeler içinde doğrulayabilirsiniz:

mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -i pubca-test-3e8b -t "connectmq/demo/3e8b/#" -v

Barındırma modellerinin karşılaştırması için bulut MQTT broker rehberimizi, sağlamlaştırma adımlarının tam listesi için MQTT TLS yapılandırması yazısını okuyun.

ConnectMQ ile Başlayın

Üretim broker'ınız için özel CA ile uğraşmayın. app.connectmq.com adresinden ConnectMQ'ya kaydolun, kredi kartı gerektirmeyen ücretsiz Serverless planını seçin, bir broker oluşturun ve oluşturulan kullanıcı adı, parola ve client ID ile 8883 portundan bağlanın. Sertifikaları ve yenilemeleri ConnectMQ halleder; self-signed kurulumunuzu ait olduğu yerde, laboratuvarda tutun.

Sık Sorulan Sorular

Üretimdeki MQTT'de self-signed sertifika kullanabilir miyim?

Her istemciyi kontrol ettiğiniz kapalı ağlarda, düzgün bir özel CA işletmeniz ve yenilemeleri yönetmeniz koşuluyla kullanabilirsiniz. İnternete açık broker'lar için herkese açık güvenilen bir sertifika daha basittir ve güveni her istemciye dağıtma ihtiyacını ortadan kaldırır.

İstemcim CA dosyası olmasına rağmen sertifikayı neden reddediyor?

En yaygın neden eksik veya hatalı bir Subject Alternative Name'dir. openssl x509 -noout -ext subjectAltName -in broker.crt ile kontrol edin ve istemcilerin kullandığı hostname'i içerdiğinden emin olun.

Dahili bir broker için Let's Encrypt sertifikası alabilir miyim?

Yalnızca kontrol ettiğiniz herkese açık bir alan adı için, DNS doğrulaması kullanarak. Herkese açık CA'lar özel IP adresleri veya .local adları için sertifika vermez.

Sertifikayı yeniledikten sonra Mosquitto'yu yeniden başlatmam gerekir mi?

Mosquitto sertifikaları başlangıçta yükler; bu yüzden yenilemeden sonra bir yeniden başlatma veya reload planlayın ve ardından openssl s_client ile test edin.

İlgili yazılar

MQTT Kimlik Bilgileri Kesintisiz Nasıl Yenilenir?

Bir filo genelinde MQTT kullanıcı adı ve şifrelerini yenilemek için adım adım çift kimlik bilgisi stratejisi: yeni kimlik bilgisini hazırlayın, geri dönüş seçeneğiyle geçiş yapın, doğrulayın ve ancak ondan sonra eskisini iptal edin.

6 dk okuma

MQTT Kimlik Bilgilerini Gömülü Cihazlarda Güvenle Saklamak

ESP32 ve Linux cihazlarda MQTT kullanıcı adı ve şifrelerini korumanın yollarına pratik bir karşılaştırma; şifrelenmiş NVS ve flash şifrelemeden secure element'lere ve TPM destekli systemd kimlik bilgilerine kadar.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.