web-dev-qa-db-ja.com

Nginx。リストにないssl仮想サーバーへのリクエストを拒否するにはどうすればよいですか?

同じIPにワイルドカードSSL証明書といくつかのサブドメインがあります。ここで、nginxが言及されたサーバー名のみを処理し、他のサーバーの接続をドロップして、リストされていないサーバー名に対してnginxが実行されないようにしたい(応答せず、拒否し、デッドし、応答の1バイトではない) )。私は次のことをします

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;
  //}
}

私は最後のサーバーブロックでほぼすべてを試しましたが、成功しませんでした。既知の仮想サーバーから有効な応答が返されるか、エラーコードが返されます。助けてください。

14
andbi

この方法では機能しません。SSLハンドシェイクはHTTPの前に発生するため、nginx構成内でリダイレクトまたはその他の操作を行う前に、証明書の名前がブラウザで評価されます。

7
cjc

Cjcの回答は、SSLが有効になっているときにホスト名を照合しようとする場合の問題をすでに正しく指摘しています。ただし、次のように実行できます。

server {
    ...

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

注:はい、一般的には ifは悪です であるのは事実ですが、この場合はifを使用しても安全です。 (自分を納得させる必要がある場合は、リンク先のページを読んでください。)

これまでの提案とは逆に、次のブロックを追加するだけでは機能しません。

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

validname.domain.comと一致するSSL証明書は、ランダムなドメイン名と一致しないためです。私は試してみましたが、nginxはブロックがまったく存在しないかのように動作しました。

これも機能しません:

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

これは、ポート443でのevery singleHTTPS接続が失敗するためです。私もこれを試しました。 wgetがSSLハンドシェイクエラーを報告しました。

14
Louis

ここでのほとんどの答えは、なぜ機能しないか、howではない、についてですそれを動作させるために。

方法は次のとおりです。このようなキャッチオールサーバーを「default_server」にして、cert/keyへのパスを提供し、着信sslリクエストを復号化してHostヘッダーに一致させる必要があります。

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;
}

そこのssl_certificate/ssl_certificate_keyに注意してください。これらが指定されていない場合でも、nginxはそのようなdefault_serverを使用しようとし、証明書/キーなしのssl接続を受け入れることができないため失敗します。証明書/鍵はどれでも使用できます。自己署名。 ...

自己署名証明書を生成するには:

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

https://serverfault.com/a/841643/87439 も参照してください

6
andreycpp

私は本日、上記のソリューションを実装しましたが、問題なく動作しました。現在、指定されていないすべてのURLは削除されます。このサーバーコードを実際の仮想サーバーエントリの前に配置することが重要でした。不正な形式のURLはすべて、この「デフォルト」サーバーに移動します。

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

server {
     listen       443;
     server_name  [URL]
1
david sexton

リストにないアイテムを処理するサーバーを構成の最初のサーバーブロックにすることで、これを処理できるはずです。

http {
    ...

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

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

特に識別されていないすべてのドメインは、このサーバーブロックによって処理されます。

0
Dayo