Neden dinle 443 default_server; nginx kuralı zaten yapılandırılmış kuralı geçersiz kıl (http kuralları normal şekilde çalışıyor)?


9

Bir nginx ve farklı alt alan adlarım var:

a.mydomain.com
b.mydomain.com
c.mydomain.com

Nginx'in 4 kuralı vardır:

1) yeniden yazma kuralı:

server {
  listen 80
  server_name gl.udesk.org;

  root /nowhere;
  rewrite ^ https://a.mydomain.com$request_uri permanent;
}

2) https kuralı:

server {

  listen 443;
  server_name a.mydomain.com;

  root /home/a/a/public;

  ssl on;
  ssl_certificate conf.d/ssl/a.crt;
  ssl_certificate_key conf.d/ssl/a.key;
  ssl_protocols ...
  ssl_ciphers ...
  ssl_prefer_server_ciphers on;

  location ...
}

3) http varsayılan kuralı:

server {
  listen 80 default_server;
  return 444;
}

4) https varsayılan kuralı:

server {
  listen 443 default_server;
  return 444;
}

Eğer nginx ve başlarsanız:

Nginx'teki https kurallarının yapılandırılması neden bu kadar zor ve http sürümüyle aynı davranışı elde etmek için bunları nasıl düzgün bir şekilde yapılandırmalıyım?

Güncelleme:

Yeni bir sertifika oluşturma ve ekleme:

ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;

şimdi çalışıyor, ancak herhangi bir SSL sertifikası gerekmeden bir çözümüm olurdu. Bir sertifika vermeden https://a.alan_adim.com.tr hariç tüm https (bağlantı noktası 443) alt etki alanları için tüm bağlantıları sıfırlamanız yeterlidir .


2
Yapamazsın. SSL , web sunucusu istediğiniz etki alanını bilmeden önce bir sertifika gerektirir . Göndermek için bir sertifikası olmalıdır veya istemciyle konuşmak için bağlantı kuramaz.
Darth Android

2
@DarthAndroid: Sihire SNI denir - en.wikipedia.org/wiki/Server_Name_Indication .
Shi

@Shi SNI'nın farkındayım - Bu, web sunucusunun hangi sertifikayı göndereceğini seçmesine izin veriyor , ancak yine de bir sertifika seçmesi gerekiyor . nginxkullanıcının ne yapmak istediğine ilişkin bir sertifikaya ihtiyaç duymadığını anlayacak kadar akıllı değildir.
Darth Android

Yanıtlar:


3

443 numaralı bağlantı noktasını ssl ile karıştırmayın! Nginx tamamen port agnostiktir. Https'yi Port 80 üzerinden de sunabilirsiniz. Modern nginx sürümleri

listen 1234 ssl;

ve ssl on;o zaman hatta ihtiyacınız yok .

Ancak https sunmak istiyorsanız bir sertifika belirtmeniz gerekir. Sunucunuz http isteğini bir https isteğine yeniden yazdığında https girer.

SSL anlaşması her şeyden önce yapıldığından PROTOKOL HATASI'nı alırsınız. Yani return 444ulaşılamıyor. Ve herhangi bir SSL El Sıkışma, sertifika / özel anahtar çifti ile şifreleme algoritmalarını beslemek için bir sertifikaya ve özel bir anahtara ihtiyaç duyacaktır.


3

returnYönerge yeniden yazma modülünün bir parçasıdır. Belgeleri kontrol ederseniz, isteklerle çalıştığını görebilirsiniz. HTTPS'de istekler ancak el sıkışma bittikten sonra yapılabilir.

Bir özellik isteği var: https://trac.nginx.org/nginx/ticket/195 ve geçici bir çözüm sağlandı.

server {
    listen 443 ssl;
    server_name bbb.example.com;
    ssl_ciphers aNULL;
    ssl_certificate /path/to/dummy.crt;
    ssl_certificate_key /path/to/dummy.key;
    return 444;
}

(Nginx kendi gibi olmayan bu SNI özellikli HTTPS istemcileri kıracak Not proxy_passBelirlediğiniz sürece proxy_ssl_server_name on;) ulaşmasını başka server_names(şimdiye esasen meşru kırmak server_nameo s do aracılığıyla izin vermek istiyorum). Ayrıntılar için trac.nginx.org/nginx/ticket/195#comment:11 adresine bakın.
nh2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.