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
- Eksik SAN: zincir geçerli olsa bile hostname doğrulaması başarısız olur.
- Yanlış dosyayı dağıtmak: istemcilerin
broker.crtdeğilca.crtdosyasına ihtiyacı vardır;ca.keyise asla dağıtılmaz. - Doğrulamayı kapatmak:
--insecure,tls_insecure_set(True)veyarejectUnauthorized: falsesertifikayı anlamsız kılar. - 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.
- 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.
- 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.
- 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.



