UnrealIRCd 6 kurulumlarında en sık karşılaşılan iki operasyonel dert vardır: kullanıcıların istemcisinde beliren "güvenilmeyen sertifika" uyarısı ve üç ayda bir sessizce süresi dolup bağlantıları kesen sertifikalar. Her ikisinin de çözümü Let's Encrypt ile otomatik sertifika yönetimidir; ancak IRC sunucularında bu iş, bir web sunucusundaki kadar basit değildir. Yanlış kurgulanmış bir yenileme, sunucular arası bağlantıları (link) kopartır ve certfp ile oper girişlerini bozar.

Bu rehberde; certbot kurulumunu, düşük yetkili unrealircd kullanıcısının sertifikaları okuyabilmesi için gereken izin düzenini, istemci ve sunucu bağlantıları için ikili sertifika (dual certificate) yapısını, yeniden yükleme kancalarını ve TLS sertleştirme ayarlarını adım adım kuruyoruz.

1. Neden ikili sertifika yapısı?


UnrealIRCd'de sertifika iki ayrı amaçla kullanılır ve bu ikisinin gereksinimleri birbirine terstir:

KullanımGereksinimUygun sertifika
İstemci bağlantıları (6697/tls)Tarayıcı ve istemcilerin tanıdığı bir CA tarafından imzalı olmalıLet's Encrypt
Sunucu bağlantıları (link)Parmak izi (spkifp/certfp) uzun süre sabit kalmalıUzun ömürlü kendinden imzalı


Let's Encrypt sertifikaları 90 günde bir yenilenir ve her yenilemede anahtar değişebilir. Sunucu linklerinizi bu sertifikanın parmak iziyle doğruluyorsanız, her yenilemede link bloklarındaki spkifp değerini elle güncellemeniz gerekir; bunu unutan herkes bir sabaha karşı kopmuş ağla uyanır. Bu nedenle resmî yaklaşım nettir: istemciler için Let's Encrypt, sunucu linkleri için kendinden imzalı sabit sertifika.

2. certbot kurulumu ve sertifikanın alınması


certbot sürümünün 0.29.0 veya üzeri olması gerekir; birçok dağıtım hâlâ daha eski paketler taşır, bu yüzden sürümü mutlaka doğrulayın.

CODE TERMINAL
certbot --version
# Debian/Ubuntu'da killall icin:
sudo apt install -y psmisc


Tek sunuculu bir kurulumda http-01 doğrulaması yeterlidir. 80 numaralı portu geçici olarak certbot'un kendisi dinler:

CODE TERMINAL
sudo certbot certonly --standalone --preferred-challenges http-01 \
  -d irc.ornek.org \
  --deploy-hook "killall -USR1 unrealircd"


Birden fazla IRC sunucusu için: aynı alan adını birden çok makinede doğrulamanız gerekiyorsa http-01 yerine dns-01 doğrulamasına geçin. Aynı makinede birden fazla UnrealIRCd süreci varsa deploy kancasını kullanıcı bağlamında çalıştırın:

CODE TERMINAL
--deploy-hook "su -c 'cd ~/unrealircd; ./unrealircd reloadtls' - unrealircd"


İşlem bittiğinde dosyalar şu yollarda olur:

DosyaYol
Tam zincir/etc/letsencrypt/live/irc.ornek.org/fullchain.pem
Özel anahtar/etc/letsencrypt/live/irc.ornek.org/privkey.pem


3. İzinler: bu adımı atlarsanız "Permission denied" alırsınız


UnrealIRCd root olarak çalışmaz; düşük yetkili bir hesapla çalışır. Let's Encrypt dizinleri ise varsayılan olarak yalnızca root'a açıktır. Bu yüzden dizinleri geçilebilir yapıp, ilgili alan adının dosyalarını IRC grubuna okutmanız gerekir.

CODE TERMINAL
# Ust dizinleri gecilebilir yap
sudo chmod go+x /etc/letsencrypt/live/ /etc/letsencrypt/archive/

# Yalnizca kendi alan adinizin dizinlerini gruba ac ("irc" yerine kendi grubunuzu yazin)
sudo chown root:irc /etc/letsencrypt/live/irc.ornek.org /etc/letsencrypt/archive/irc.ornek.org/ -R
sudo chmod g+rx,o-rwx /etc/letsencrypt/live/irc.ornek.org /etc/letsencrypt/archive/irc.ornek.org/ -R


Sonuç: anahtar ve sertifika dosyalarını yalnızca root ve irc grubunun üyeleri okuyabilir. Diğer alan adlarının sertifikaları etkilenmez.

Doğrulama, tahmin etmekten iyidir:

CODE TERMINAL
sudo -u irc cat /etc/letsencrypt/live/irc.ornek.org/privkey.pem > /dev/null && echo "okunabilir"


Dikkat: live dizinindeki dosyalar birer sembolik bağdır; gerçek dosyalar archive altındadır. Yalnızca live dizinine izin verip archive'ı unutmak, en sık yapılan hatadır.

4. unrealircd.conf yapılandırması



4.1 UnrealIRCd 6.2.6 ve sonrası


Bu sürümlerden itibaren istemci sertifikası ile sunucu linkleme sertifikası tek blokta ayrıştırılabilir:

CODE TERMINAL
set {
    tls {
        certificate "/etc/letsencrypt/live/irc.ornek.org/fullchain.pem";
        key         "/etc/letsencrypt/live/irc.ornek.org/privkey.pem";
    }

    server-linking {
        tls-options {
            certificate "tls/server.cert.pem";
            key         "tls/server.key.pem";
        }
    }
}


Bu yapı tam olarak istediğimiz sonucu verir: istemciler güvenilir bir CA sertifikası görür, sunucu linkleri ise 90 günlük döngüden hiç etkilenmez.

4.2 UnrealIRCd 6.2.5 ve öncesi


Eski sürümlerde ayrım listen bloğu düzeyinde yapılır:

CODE TERMINAL
listen {
    ip *;
    port 6697;
    options { tls; }
    tls-options {
        certificate "/etc/letsencrypt/live/irc.ornek.org/fullchain.pem";
        key         "/etc/letsencrypt/live/irc.ornek.org/privkey.pem";
    }
}

listen {
    ip *;
    port 6900;
    options { tls; serversonly; }
    /* Bu port varsayilan (kendinden imzali) sertifikayi kullanir */
}


Sunucu linkleme portunu serversonly ile ayırmak, hem sertifika ayrımını hem de saldırı yüzeyi daraltmasını birlikte sağlar.

5. Yenileme sonrası sertifikayı yeniden yüklemek


Sertifika yenilendiğinde UnrealIRCd'nin yeni dosyayı belleğe alması gerekir. Yeniden başlatmaya gerek yoktur; bağlantılar kopmadan yükleme yapılabilir. Üç eşdeğer yol vardır:

YöntemKullanımNot
./unrealircd reloadtlsKabuktan, IRC'ye bağlanmadanEn pratik yol
kill -USR1 (killall -USR1 unrealircd)Deploy kancası içindeTek süreç varsa uygundur
/REHASH -sslIRC üzerinden, oper yetkisiyleElle müdahale için


certbot'un yenileme zamanlayıcısı bu kancayı kendiliğinden çalıştırır, ancak kancanın gerçekten çalıştığını yenileme gününü beklemeden doğrulayın:

CODE TERMINAL
sudo certbot renew --dry-run


Çıktıda deploy kancasının tetiklendiğini görmelisiniz. Ardından sunucu günlüğünde TLS sertifikalarının yeniden yüklendiğine dair kaydı arayın.

FreeBSD'de haftalık yenileme kontrolünü açmayı unutmayın:

CODE TERMINAL
echo 'weekly_certbot_enable="YES"' >> /etc/periodic.conf


6. TLS sertleştirme: yalnızca sertifika yetmez


Geçerli bir sertifika, zayıf bir TLS yapılandırmasını kurtarmaz. set::tls bloğunda kullanabileceğiniz temel sertleştirme ayarları:

CODE TERMINAL
set {
    tls {
        certificate "/etc/letsencrypt/live/irc.ornek.org/fullchain.pem";
        key         "/etc/letsencrypt/live/irc.ornek.org/privkey.pem";

        protocols "TLSv1.2,TLSv1.3";
        ciphersuites "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256";

        outdated-protocols "TLSv1.0,TLSv1.1";
        outdated-ciphers   "AES*";

        sts-policy {
            port 6697;
            duration 90d;
        }
    }

    outdated-tls-policy {
        client warn;
        oper deny;
        server deny;
    }
}


Ayarların anlamı:


  • protocols — TLS 1.0 ve 1.1'i tamamen devre dışı bırakır. 2026'da bunları açık tutmak için geçerli bir gerekçe yoktur.
  • outdated-protocols / outdated-ciphers — "eski" sayılacak protokol ve şifre takımlarını tanımlar. Varsayılan outdated-ciphers değeri olan AES*, ileri gizliliği (forward secrecy) olmayan takımları eski kabul eder.
  • outdated-tls-policy — eski TLS kullananlara ne yapılacağını belirler. Operlar ve sunucu linkleri için deny yapmak güvenli bir varsayılandır; istemciler için önce warn ile başlayıp kullanıcı tepkisini ölçmek daha az sancılıdır.
  • sts-policy — istemciye "bu sunucuya bundan sonra yalnızca TLS ile bağlan" der. Düşürme (downgrade) saldırılarını kırar.



STS uyarısı: sts-policy süresi istemcide önbelleğe alınır. Yapılandırmayı denerken duration değerini önce kısa tutun (örneğin 1d); 90d ile yapılan hatalı bir deneme, kullanıcıların uzun süre düz metin porta bağlanamamasına yol açar.

7. certfp ve spkifp'yi bozmamak


Let's Encrypt'e geçişte en çok gözden kaçan nokta budur. UnrealIRCd'de iki farklı parmak izi kullanılır:


  • certfp — sertifikanın kendisinin SHA-256 özeti. Oper bloklarında istemci sertifikası doğrulaması için kullanılır. Bu, kullanıcının sertifikasıdır; sunucunun Let's Encrypt sertifikasını değiştirmek operların certfp değerlerini etkilemez.
  • spkifp — açık anahtarın (SPKI) özeti. Link bloklarında karşı sunucunun doğrulanması için kullanılır ve sunucunun sertifikasına bağlıdır.



Buradaki tuzak şudur: link bloklarınızda spkifp yerine sunucunun istemci sertifikasının parmak izini kullanıyorsanız, ilk Let's Encrypt yenilemesinde ağınız bölünür. Bölüm 4'teki ikili sertifika yapısı tam olarak bu sorunu ortadan kaldırır; server-linking altındaki sabit sertifikanın parmak izini alın:

CODE TERMINAL
openssl x509 -in ~/unrealircd/conf/tls/server.cert.pem -pubkey -noout \
  | openssl pkey -pubin -outform der \
  | openssl dgst -sha256 -hex


Çıkan değeri karşı taraftaki link bloğunda kullanın:

CODE TERMINAL
link hub.ornek.org {
    incoming { mask *@203.0.113.10; }
    outgoing {
        bind-ip *;
        hostname hub.ornek.org;
        port 6900;
        options { tls; }
    }
    verify-certificate yes;
    password "PARMAK_IZI_BURAYA" { spkifp; }
    class servers;
}


8. Doğrulama ve sorun giderme


Kurulumu bitirdikten sonra dışarıdan doğrulayın:

CODE TERMINAL
# Sertifika zinciri ve son gecerlilik tarihi
openssl s_client -connect irc.ornek.org:6697 -servername irc.ornek.org < /dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates

# Kullanilan protokol ve sifre takimi
openssl s_client -connect irc.ornek.org:6697 -tls1_3 < /dev/null 2>&1 | grep -E "Protocol|Cipher"


Sık karşılaşılan hatalar:

BelirtiOlası nedenÇözüm
Permission denied / anahtar okunamıyorarchive dizinine izin verilmemişBölüm 3'teki chown/chmod adımlarını archive için de uygulayın
İstemcide "unknown CA"privkey ile birlikte cert.pem kullanılmışfullchain.pem kullanın, ara sertifikalar onun içindedir
Yenileme sonrası eski sertifika sunuluyordeploy kancası çalışmamışcertbot renew --dry-run ile kancayı doğrulayın
Yenileme sonrası link kopuyorLink doğrulaması Let's Encrypt sertifikasına bağlıİkili sertifika yapısına geçin, spkifp'yi sabit sertifikadan alın
Bazı istemciler bağlanamıyorprotocols ayarı TLS 1.2 öncesini kapatmışBeklenen davranıştır; istemcileri güncelleyin


Sonuç


Let's Encrypt, IRC sunucularında da tek seferlik bir kurulum işidir; asıl mesele yenilemenin sessizce ve zarar vermeden gerçekleşmesidir. Üç noktayı doğru kurarsanız bu iş kendiliğinden yürür: sertifikaları düşük yetkili kullanıcıya doğru izinlerle okutmak, deploy kancasıyla reloadtls çağırmak ve sunucu linklerini yenilenen sertifikadan tamamen ayırmak. Üzerine protocols, outdated-tls-policy ve sts-policy ayarlarını eklediğinizde, ağınız yalnızca "geçerli sertifikaya sahip" değil, gerçekten güncel bir TLS yapılandırmasına sahip olur.
TR Siber Ekibi Yazar · TRSiber
← Ana sayfaya dön