NginxにHTTPS経由で不明なサーバー名を拒否させる


7

Sginを使用して単一のIPから複数のHTTPSドメインを提供するNginxインスタンスがあります。

セットアップの唯一の不具合は、サーバーのベアIPのURL、または対応するHTTPSサーバーブロックがないIPにリストされているドメインが要求されると、Nginxが最初の(デフォルトとして動作する)ドメインで応答することです。この場合、単純に標準の403 Forbiddenを返すほうを好みます-これを行うためにデフォルトのサーバーブロックを設定しますが、クライアント証明書の不一致の警告を回避する方法がわかりません。

(どのようにc | C)ブラウザを混乱させる特定のssl証明書を指定する必要なしに、そのような未知/未定義のドメインへのリクエストを拒否するようにNginxを設定しますか?(つまり、「悪い」証明書でクライアントを混乱させる前に、403でNginxがリクエストを拒否する必要があります-クライアントのPOVから、これはHTTPSサーバーブロックがまったく定義されていない場合と同じです。)

回答:


7

この質問は私が昨日回答したものと非常に似ています:nginxとSNI:ドメイン名でSSL証明書を自動的に解決することは可能ですか

ユーザーがブラウザに不正な証明書メッセージを表示する前に接続を拒否することはできません。NginxがHTTP 403応答を返すまでに、SSLハンドシェイクは終了し、ハンドシェイクを完了するには、ブラウザーが提供された証明書を受け入れる必要があります。ユーザーが証明書を受け入れた後でのみ、デフォルトサーバーを設定して接続を拒否できます。

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

ただし、最新のブラウザはサーバー名表示をサポートしており、各仮想ホストに証明書が設定されている場合、通常のユーザーがそのメッセージを表示することはほとんどありません。

iptablesでSSLによって示された有効なホスト名がない接続を拒否することは可能かもしれませんが、それはおそらくかなりトリッキーであり、どの標準にもまったく準拠していません。

更新された情報:return 444証明書エラーが表示される直前にtcp接続を中止することが可能です。


SNIを使用すると、理論的には、特定のドメイン名の証明書がないときに接続を中止できます。これは、証明書エラーを表示するよりも優れています。これを行う方法を知っていますか?
Yogu 2014年

はい、return 444証明書エラーが表示される前にtcp接続を中止できることがわかりました。
xblax 2014年

@xblax証明書が表示される前に444を返す方法も教えてください。理想的には、わからないserver_nameへのリクエストのハンドシェイクでリソースを無駄にしないでしょう。SNIは、要求を解読する前に、要求された名前を明らかにする必要があります。
Static Storm

0

ドメインが同じマスター(* .example.com)のサブドメインである場合は、ワイルドカード証明書を使用できます。これに失敗すると、ブラウザが満足する証明書を提供できないと思います。


こんにちは、クリス。ワイルドカードポイントに感謝しますが、それは実際に求めていることではありません。はい、ブラウザは証明書を好きではありませんが、要求されたサーバー名に基づいて接続を拒否する方法はありますか?(私は疑っていませんが、これは尋ねる場所のようです... :)
カールトンギブソン

テストされていない仮定->有効な証明書を提供する必要があります。そうしないと、ブラウザが接続を安全ではないと見なします。したがって、ブラウザは、ユーザーが上書きを許可するまで、送信したリダイレクトを処理しません。オーバーライドを自動的に実行するには、有効な証明書を提供するしかありません。:-(
クリス・ナバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.