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


12

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

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

回答:


7

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


これは悪いですが、認めなければなりません)ありがとう。
-andbi

3
これは真実ではありません。他の回答で説明されているように、応答なしで接続を切断するなど、より低いレベルで何かを行うことができます。
コリマルコ14年

12

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上のすべての HTTPS接続が失敗するからです。私もこれを試しました。wgetSSLハンドシェイクエラーが報告されました。


4

ここでのほとんどの回答は、なぜ機能しないのではなく、機能させる方法に関するものです。

方法は次のとおりです。このようなキャッチオールサーバーを「default_server」にし、証明書/キーへのパスを提供する必要があります。これにより、着信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 

/server//a/841643/87439も参照してください


1
これを試しましたか?サーバー名「_」に一致するSSL証明書を作成するにはどうすればよいですか?
ティム

はい、この解決策は私に適しています。私は同じ正確な問題を抱えており、ドキュメントから、nginxはTLS SNIを見ていないので証明書/キーが必要であると考えました。自己署名など、任意の証明書/キーを使用できます。
-andreycpp

1

今日、上記のソリューションを実装しましたが、うまくいきました。現在、指定されていないすべてのURLはドロップされます。実際の仮想サーバーエントリがキーになる前にこのサーバーコードを配置する-不正な形式のURLはすべて、この「デフォルト」サーバーに移動します。

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

server {
     listen       443;
     server_name  [URL]

0

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

http {
    ...

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

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

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


1
動作しません
-AmirHossein
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.