Bir domain'i ve alt domain'lerini DNS-01 ile HTTPS üzerinden sunun

Wildcard sertifika ile HTTPS

Bu rehber example.com domain'ini ve bütün alt domain'lerini HTTPS üzerinden sunar. r3v3rs3 Let's Encrypt'ten DNS-01 challenge ile tek bir wildcard sertifika alır, HTTP'yi HTTPS'e yönlendirir ve HSTS gönderir.

Wildcard sertifika veren tek challenge DNS-01'dir. DNS-01 doğrulama için açık port da istemez, bu yüzden firewall arkasındaki bir sunucuda çalışır.

Başlamadan önce

Adım 1: API credential'ını oluşturun

Zone'daki _acme-challenge TXT kayıtlarını yazabilen bir credential oluşturun. r3v3rs3 her kaydı doğrulamadan önce oluşturur, doğrulamadan sonra siler.

ProviderCredentialİzinler
CloudflareAPI TokenZone için Zone:Read ve DNS:Edit
Route 53Access Key ID, Secret Access Keyroute53:ListHostedZones ve route53:ChangeResourceRecordSets

Diğer 13 provider'ı credential'larıyla DNS-01 tablosu listeler. İkisi hosting provider'ı istemez: webhook provider'ı kendi servisinizi çağırır, exec provider'ı r3v3rs3 host'unda bir program çalıştırır.

Adım 2: HTTP ve HTTPS portlarını bağlayın

Wildcard sertifika açık port istemez, ama siteniz ister.

  1. Menüde Portlar linkine, sonra Ekle butonuna tıklayın.
  2. Interface olarak 0.0.0.0, port olarak 443, protokol olarak HTTPS seçin. Oluştur butonuna tıklayın.
  3. İkinci bir port ekleyin: port 80, protokol HTTP. Adım 5 bu portu yönlendirir.
  4. İki portun da Dinliyor durumunda olduğunu kontrol edin.

Linux'ta 1024 altındaki bir port root veya CAP_NET_BIND_SERVICE capability'si ister.

Adım 3: ACME kaydını oluşturun

  1. Menüde Sertifikalar linkine, sonra ACME sekmesine, sonra Ekle butonuna tıklayın.
  2. Sağlayıcı olarak Let's Encrypt seçin. Sayfa onun directory URL'ini kullanır. ACME Sağlayıcısı listesinde Google Trust Services, ZeroSSL ve custom bir sunucu da vardır.
  3. E-posta Adresi alanına adresinizi yazın. Sertifika otoritesi bitiş uyarılarını oraya gönderir.
  4. Domain Adları alanına example.com, *.example.com yazın. Sertifika her adı bir Subject Alternative Name olarak taşır.
  5. Challenge alanında DNS-01 seçin.
  6. DNS Provider alanında provider'ınızı seçin ve Adım 1'deki credential alanlarını doldurun.
  7. Oluştur butonuna tıklayın. Hazır sağlayıcılar her order'dan 60 gün sonra yeni order verir. Custom bir sunucuda Yenileme Aralığı (Gün) alanı vardır.

r3v3rs3 sertifikayı hemen, sonra her yenileme kontrolünde ister. example.com ve *.example.com aynı TXT kayıt adını, _acme-challenge.example.com adını paylaşır, bu yüzden doğrulama sırasında kayıt iki değer taşır.

r3v3rs3 kaydı acme.toml dosyasında saklar:

[abc-def]
provider = "Let's Encrypt"
renewal_days = 60
identifiers = ["example.com", "*.example.com"]
challenge_type = "dns-01"

[abc-def.dns_provider]
provider = "cloudflare"
api_token = "<token>"

Kaydı bu dosyada değil, panelde oluşturun. r3v3rs3 ACME hesabını kaydı eklediğinizde oluşturur. Dosya hesap key'ini ve credential'ı düz metin olarak, 0600 moduyla tutar. Admin API onları döndürmez.

Adım 4: Sertifikayı kontrol edin

Order'dan sonra Sunucu Sertifikaları sekmesi sertifikayı gösterir. Sekme issuer'ı, subject adlarını ve Yenileme Tarihi alanını yazar.

Başarısız bir order nedenini sunucu log'una yazar, r3v3rs3 bir saat sonra tekrar order verir. İki neden sık görülür:

Adım 5: Proxy'yi oluşturun

  1. Menüde Proxy'ler linkine, sonra Ekle butonuna tıklayın.
  2. Protokol olarak HTTP / HTTPS seçin.
  3. Adım 2'deki iki portu da seçin. Proxy yönlendirme için HTTP portuna, trafik için HTTPS portuna ihtiyaç duyar.
  4. Virtual Host'lar alanına app.example.com yazın. Wildcard sertifika bütün alt domain'leri kapsar, bu yüzden her alt domain kendi proxy'sini alabilir.
  5. Hedef alanına uygulamanızın adresini yazın, örneğin http://127.0.0.1:3000.
  6. HTTP'yi Otomatik Olarak HTTPS'e Yönlendir seçeneğini açın.
  7. Oluştur butonuna tıklayın.

r3v3rs3 sertifikayı TLS handshake'indeki SNI adından seçer, bu yüzden HTTPS portunda sertifika ayarı gerekmez.

İki protokolü de kontrol edin:

$ curl -i http://app.example.com/
HTTP/1.1 301 Moved Permanently
location: https://app.example.com/

$ curl -i https://app.example.com/
HTTP/2 200

Yönlendirme path'i ve query'yi korur. Redirect kurallarından ve kimlik doğrulamasından önce çalışır.

Adım 6: HSTS gönderin

HSTS, tarayıcıya bir sonraki request'te yönlendirme beklemeden HTTPS kullanmasını söyler. Bunu bir response header kuralı olarak ekleyin:

  1. Proxy'yi açın ve Header Kuralları bölümünü bulun.
  2. Response Header'ları alanına şu satırı yazın:
set Strict-Transport-Security: max-age=31536000; includeSubDomains
  1. Kaydedin.
$ curl -sI https://app.example.com/ | grep -i strict
strict-transport-security: max-age=31536000; includeSubDomains

Adım 7: HTTP/3 ekleyin

HTTP/3, QUIC üzerinde çalışır ve QUIC UDP'dir. HTTPS portunun yanına ikinci bir port ister; onun yerini almaz.

  1. Portlar sayfasını açın ve bir port ekleyin.
  2. Protokolü QUIC üzerinden HTTP (HTTP/3) yapın.
  3. 0.0.0.0:443 adresini dinleyin. Bu UDP 443'tür, HTTPS portunun TCP 443'ü ile çakışmaz.
  4. TLS Termination alanına HTTPS portuyla aynı server name'leri yazın, böylece iki port aynı sertifikayı kullanır.
  5. Proxy'yi açın ve yeni portu HTTPS portunun yanına ekleyin.

Portun listen adresi şöyle olur:

/ip4/0.0.0.0/udp/443/quic/https

Bundan sonra proxy'nin her response'u bir alt-svc header'ı taşır:

$ curl -sI https://app.example.com/
HTTP/2 200
alt-svc: h2=":443", h3=":443", h3-25=":443"

Bu header'ı r3v3rs3 kendisi yazar; değerini proxy'nin HTTPS portundan ve QUIC portundan üretir. Upstream sunucunun gönderdiği alt-svc header'ını siler. Tarayıcı header'ı okur, QUIC portunu hatırlar ve sonraki request'te HTTP/3 kullanır. İlk request her zaman TCP'dir, bu yüzden UDP kapalıysa hiçbir şey bozulmaz.

Kontrol edilecek üç şey:

HTTP/3 yalnız gelen bağlantılar için vardır. Upstream bağlantısı HTTP/2 veya HTTP/1.1 kullanır, WebTransport desteklenmez.

Yenileme

r3v3rs3 son order'dan renewal_days sonra yeni bir sertifika ister, hazır sağlayıcılarda 60 gün. Let's Encrypt sertifikası 90 gün geçerlidir, yani yenilemenin 30 gün payı olur. Order DNS-01 challenge'ını tekrarlar, bu yüzden credential geçerli kalmalıdır. Cluster'da sertifikayı yalnız leader ister.

Ayarlar sayfasında bir bildirim webhook'u vardır. Bitişten önce certificate_expiring, başarısız bir order'dan sonra acme_order_failed event'i gönderir, böylece bozulan bir credential sessiz kalmaz. Event'leri Bildirimler bölümü anlatır.

Sonraki adımlar