HTTP Public Key Pinning (HPKP) ile SSL Sertifika Güvenliği
Merhaba değerli okuyucular! Bugün, web güvenliğinin önemli bir bileşeni olan HTTP Public Key Pinning (HPKP) ve bunun SSL sertifika güvenliğini nasıl artırdığını derinlemesine inceleyeceğiz. HPKP'nin nasıl çalıştığını, nasıl uygulanacağını ve dikkat edilmesi gereken noktaları ele alacağız. Hazırsanız, SSL sertifika güvenliğinin bu ileri seviye konusuna dalalım!
HTTP Public Key Pinning (HPKP) Nedir?
HPKP, bir web sunucusunun, gelecekteki bağlantılarda kullanılması gereken geçerli SSL/TLS sertifika public key'lerini (veya bunların hash'lerini) istemciye (genellikle web tarayıcısı) bildirmesine olanak tanıyan bir HTTP güvenlik mekanizmasıdır. Bu, man-in-the-middle (MITM) saldırılarına ve sahte SSL sertifikalarının kullanımına karşı ek bir koruma katmanı sağlar.
HPKP Nasıl Çalışır?
- Sunucu, HTTPS yanıtında Public-Key-Pins başlığını gönderir.
- Bu başlık, geçerli public key'lerin hash'lerini ve geçerlilik süresini içerir.
- Tarayıcı bu bilgiyi kaydeder ve belirtilen süre boyunca saklar.
- Gelecekteki bağlantılarda, tarayıcı sunucunun sertifikasını bu kayıtlı hash'lerle karşılaştırır.
- Eğer sertifika eşleşmezse, tarayıcı bağlantıyı reddeder.
HPKP Nasıl Uygulanır?
1. Public Key Hash'lerini Oluşturma
İlk adım, sertifika zincirinizdeki public key'lerin hash'lerini oluşturmaktır. Bunu OpenSSL ile yapabilirsiniz:
openssl x509 -noout -in certificate.pem -pubkey | openssl asn1parse -noout -inform pem -out public.key openssl dgst -sha256 -binary public.key | openssl enc -base64
2. HPKP Başlığını Yapılandırma
Oluşturduğunuz hash'leri kullanarak HPKP başlığını yapılandırın:
Public-Key-Pins: pin-sha256="base64=="; pin-sha256="base64=="; max-age=5184000; includeSubDomains
3. Web Sunucusu Yapılandırması
Örnek bir Nginx yapılandırması:
server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/certificate.pem; ssl_certificate_key /path/to/certificate.key; add_header Public-Key-Pins 'pin-sha256="base64=="; pin-sha256="base64=="; max-age=5184000; includeSubDomains'; }
HPKP Uygulama Best Practices
1. Backup Pin Kullanın
Her zaman en az bir backup pin ekleyin. Bu, mevcut sertifikanızı kaybetmeniz durumunda sitenize erişimi sürdürmenizi sağlar.
2. Kısa max-age Süresi ile Başlayın
Başlangıçta kısa bir max-age süresi kullanın ve kademeli olarak artırın. Bu, potansiyel yanlış yapılandırmaların etkisini sınırlar.
3. Report-Only Modu Kullanın
Tam uygulamadan önce Report-Only modunu kullanarak HPKP'yi test edin:
Public-Key-Pins-Report-Only: pin-sha256="base64=="; pin-sha256="base64=="; max-age=5184000; includeSubDomains; report-uri="https://example.com/hpkp-report"
4. HPKP Raporlarını İzleyin
HPKP ihlallerini izlemek ve analiz etmek için bir raporlama sistemi kurun:
const express = require('express'); const app = express(); app.post('/hpkp-report', express.json(), (req, res) => { console.log('HPKP Report:', req.body); // Raporu işle ve gerekirse uyarı gönder res.sendStatus(204); }); app.listen(3000, () => console.log('HPKP Report server running on port 3000'));
HPKP'nin Riskleri ve Dikkat Edilmesi Gerekenler
1. Yanlış Yapılandırma Riski
Yanlış yapılandırılmış HPKP, sitenize erişimi tamamen engelleyebilir. Bu nedenle, çok dikkatli bir şekilde uygulanmalıdır.
2. Sertifika Yenileme Süreci
HPKP uygulandığında, sertifika yenileme sürecinizi dikkatlice planlamalısınız. Yeni sertifikanın public key'i, önceden pinlenmiş key'lerden biriyle eşleşmelidir.
3. HPKP Suistimali
Kötü niyetli aktörler, HPKP'yi kullanarak siteleri "kapatabilir". Bu nedenle, HPKP uygulamadan önce tüm riskleri değerlendirin.
HPKP Alternatififleri
HPKP'nin risklerinden dolayı, bazı alternatif yaklaşımlar geliştirilmiştir:
1. Expect-CT Header
Certificate Transparency (CT) loglarını zorunlu kılar ve HPKP'ye göre daha az risklidir:
Expect-CT: max-age=86400, enforce, report-uri="https://example.com/ct-report"
2. CAA (Certification Authority Authorization) DNS Kaydı
Hangi CA'ların domain için sertifika verebileceğini belirler:
example.com. IN CAA 0 issue "letsencrypt.org"
HPKP İzleme ve Yönetim Aracı
HPKP'yi daha etkili bir şekilde yönetmek için bir izleme ve yönetim aracı oluşturabilirsiniz:
class HPKPManager { constructor() { this.pins = new Map(); this.reports = []; } addPin(domain, pin, expirationDate) { if (!this.pins.has(domain)) { this.pins.set(domain, []); } this.pins.get(domain).push({ pin, expirationDate }); } validatePin(domain, pin) { if (!this.pins.has(domain)) return false; return this.pins.get(domain).some(p => p.pin === pin && p.expirationDate > Date.now()); } reportViolation(report) { this.reports.push(report); this.analyzeViolation(report); } analyzeViolation(report) { console.log(`HPKP violation detected for ${report.hostname}`); // Daha detaylı analiz ve uyarı mekanizması } cleanExpiredPins() { for (const [domain, pins] of this.pins.entries()) { this.pins.set(domain, pins.filter(p => p.expirationDate > Date.now())); } } } // Kullanım örneği const hpkpManager = new HPKPManager(); hpkpManager.addPin('example.com', 'pin-sha256="base64=="', Date.now() + 30 * 24 * 60 * 60 * 1000); // Express.js ile raporlama endpoint'i app.post('/hpkp-report', express.json(), (req, res) => { hpkpManager.reportViolation(req.body); res.sendStatus(204); }); // Düzenli temizlik işlemi setInterval(() => hpkpManager.cleanExpiredPins(), 24 * 60 * 60 * 1000);
HTTP Public Key Pinning (HPKP), SSL sertifika güvenliğini artırmak için güçlü bir mekanizma sunsa da, beraberinde önemli riskler de getirir. HPKP uygulamaya karar vermeden önce, bu riskleri dikkatlice değerlendirmeli ve alternatif yaklaşımları göz önünde bulundurmalısınız.
HPKP'yi uygulamaya karar verirseniz, dikkatli bir planlama, test ve izleme süreci kritik öneme sahiptir. Backup pin'ler kullanmak, kademeli olarak uygulamak ve sürekli izleme yapmak, HPKP'nin güvenli bir şekilde uygulanmasını sağlayacaktır.
Günümüzde, birçok uzman HPKP yerine Expect-CT header'ı veya CAA DNS kayıtları gibi daha az riskli alternatifleri önermektedir. Bu alternatifleri değerlendirmek ve sitenizin güvenlik ihtiyaçlarına en uygun çözümü seçmek önemlidir.
Siz SSL sertifika güvenliğini nasıl sağlıyorsunuz? HPKP veya alternatifleri hakkında deneyimleriniz neler? Yorumlarınızı bekliyorum!
Güvenli kodlamalar ve güvenli bağlantılar dilerim!