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ım | Gereksinim | Uygun 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 psmiscTek 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:
| Dosya | Yol |
|---|---|
| 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/ -RSonuç: 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öntem | Kullanım | Not |
|---|---|---|
| ./unrealircd reloadtls | Kabuktan, IRC'ye bağlanmadan | En pratik yol |
| kill -USR1 (killall -USR1 unrealircd) | Deploy kancası içinde | Tek süreç varsa uygundur |
| /REHASH -ssl | IRC üzerinden, oper yetkisiyle | Elle 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.conf6. 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:
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Permission denied / anahtar okunamıyor | archive 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 sunuluyor | deploy kancası çalışmamış | certbot renew --dry-run ile kancayı doğrulayın |
| Yenileme sonrası link kopuyor | Link 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ıyor | protocols 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