Nginx. Liste dışı SSL sanal sunucusuna olan talebi nasıl reddederim?


14

Aynı ip üzerinde bir joker SSL sertifikası ve birkaç alt alan var. Şimdi benim nginx sadece nginxlistelenen sunucu isimlerini işlemek ve diğerleri için bağlantıyı bırakmasını istiyorum , böylece liste dışı sunucu adları için çalışmıyor gibi görünüyor (yanıt vermiyor, reddetmiyor, ölü, yanıtta tek bir bayt değil). Aşağıdakileri yaparım

ssl_certificate         tls/domain.crt;
ssl_certificate_key     tls/domain.key;

server {
  listen 1.2.3.4:443 ssl;
  server_name validname.domain.com;
  //
}

server {
  listen 1.2.3.4:443 ssl;
  server_name _;
  // deny all;
  // return 444;
  // return 404;
  //location {
  //  deny all;
  //}
}

Son sunucu bloğunda neredeyse her şeyi denedim, ama başarı yok. Bilinen sanal sunucudan geçerli bir yanıt veya hata kodu alıyorum. Lütfen yardım et.

Yanıtlar:


7

Bu şekilde çalışmaz: SSL anlaşması HTTP'den önce gerçekleşir, bu nedenle nginx yapılandırmasında yeniden yönlendirmeden veya başka bir şey yapmadan önce sertifikadaki ad tarayıcıda değerlendirilir.


bu kötü, ama itiraf etmeliyim) Teşekkürler.
andbi

3
Bu doğru değil: diğer yanıtlarda açıklandığı gibi, herhangi bir yanıt olmadan bağlantıyı bırakmak gibi daha düşük bir düzeyde başka bir şey yapabilirsiniz.
collimarco

14

Cjc tarafından verilen cevap, SSL etkinleştirildiğinde ana bilgisayar adlarını eşleştirmeye çalışmakla ilgili sorunu zaten doğru bir şekilde belirtti. Ancak, bunu yapmak mümkündür, şöyle:

server {
    ...

    if ($host !~* ^validname\.domain\.com$ ) {
        return 444;
    }
    ...
}

Not: Evet, genellikle ifkötülük olduğu doğrudur , ancak ifbu durumda kullanmak güvenlidir . (Kendinizi ikna etmeniz gerekiyorsa bağlantılı sayfayı okuyun.)

Tam olarak önerilenlere göre, sadece aşağıdaki bloğu eklemek işe yaramaz:

server {
    listen 80;
    listen 443 ssl;
    return 444;
}

çünkü eşleşen bir SSL sertifikası validname.domain.combazı rastgele alan adlarıyla eşleşmez. Denedim ve nginx blok hiç yoktu gibi davrandı.

Bu da işe yaramaz:

server {
    listen       443;
    server_name    _;
    return 444; 
}

çünkü 443 numaralı bağlantı noktasındaki her HTTPS bağlantısını, geçmesi gerekenleri bile başarısız kılacaktır . Ben de denedim. wgetSSL el sıkışma hatası bildirdi.


Bu cevap kesinlikle doğru. Sadece şüphe duyanlar için bu bölümü çalışma sunucusu yapılandırmasına eklemelisiniz. Yani konu için başlangıç ​​yapılandırma sunucusu {listen 443 ssl; sunucu_adı geçerliadı.alanadi.com; if ($ host! ~ * ^ geçerli ad \ .etkialanı \ .com $) {dönüş 444; }}
Ivan Yaremchuk

6

Buradaki yanıtların çoğu neden işe yaramıyor, nasıl işe yarayacağına değil .

İşte böyle - böyle bir tümünü yakalama sunucusunu bir 'default_server' yapmanız ve gelen SSL isteğinin şifresini çözebilmesi ve Host üstbilgisi ile eşleşmesi için cert / key yollarını sağlamanız gerekir:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404;
}

Orada ssl_certificate / ssl_certificate_key anahtarını not edin. Belirtilmezse, nginx yine de default_server'ı kullanmaya çalışır ve cert / key olmadan ssl bağlantısını kabul edemediğinden başarısız olur. Herhangi bir sertifika / anahtar kullanılabilir, örneğin kendinden imzalı. ...

Kendinden imzalı bir sertifika oluşturmak için:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 

Ayrıca bkz. Https://serverfault.com/a/841643/87439


1
Bunu denedin mi? "_" Sunucu adıyla eşleşen bir SSL sertifikası nasıl oluşturulur?
Tim

Evet, bu çözüm benim için çalışıyor. Ben aynı sorun vardı ve nginx TLS SNI bakmıyor gibi bir cert / anahtar ihtiyacı belgelerinden anladım. Herhangi bir sertifika / anahtar kullanabilirsiniz, örneğin kendinden imzalı.
andreycpp

1

Yukarıdaki çözümü bugün uyguladım ve yüzmeye çalıştı. Belirtilmeyen tüm URL'ler artık kaldırıldı. Bu sunucu kodunu gerçek sanal sunucu girişinden önce yerleştirmek çok önemliydi - tüm hatalı biçimlendirilmiş URL'ler artık bu 'varsayılan' sunucuya gidiyor.

... 
server {
     listen       443;
     server_name    _;
     return 444; }

server {
     listen       443;
     server_name  [URL]

0

Liste dışı öğeleri işleyen sunucuyu yapılandırmanızdaki ilk sunucu bloğu haline getirerek bunu halledebilmeniz gerekir.

http {
    ...

    server {
        listen 80;
        listen 443 ssl;
        return 444;
    }

    server {
        server_name validname.domain.com;
        ...
    }
}

Özel olarak tanımlanmamış tüm alan adları bu sunucu bloğu tarafından işlenir.


1
O çalışmıyor
Amirhossein
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.