web-dev-qa-db-ja.com

リッスン443 default_serverを使用する理由nginxルールは既に構成されているルールを上書きしますか(httpルールは正常に機能します)?

私はnginxとさまざまなサブドメインを持っています:

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

Nginxには4つのルールがあります。

1)書き換えルール:

server {
  listen 80
  server_name gl.udesk.org;

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

2)httpsルール:

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デフォルトルール:

server {
  listen 80 default_server;
  return 444;
}

4)httpsデフォルトルール:

server {
  listen 443 default_server;
  return 444;
}

だから私がnginxを起動して:

  • ブラウザで http://a.mydomain.com にアクセスすると、リダイレクトされて https://a.mydomain.com になり、エラー107( net :: ERR_SSL_PROTOCOL_ERROR):SSLプロトコルエラー。
  • ブラウザで https://b.mydomain.com にアクセスすると、エラー444が返されると思います。しかし、代わりに同じエラー107(net :: ERR_SSL_PROTOCOL_ERROR):SSLプロトコルエラーを返します。
  • dNSプロバイダーのCNAMEによって登録されたすべて(つまり、a、b、c)
  • 期待どおりに機能するすべてのhttpバージョン(例:ルール3-):

では、なぜnginxのhttpsルールを設定するのが非常に難しいのか、また、httpバージョンと同じ動作をするように適切に設定するにはどうすればよいですか?

更新:

新しい証明書の作成と追加:

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

今は機能しますが、SSL証明書が不要なソリューションがあります。証明書を提供せずに、 https://a.mydomain.comを除くすべてのhttps(ポート443)サブドメインのすべての接続をリセットするだけです

9
static

ポート443とSSLを混在させないでください。 Nginxは完全にポートに依存しません。ポート80を介してhttpsを提供することもできます。最新のnginxバージョンでは、

listen 1234 ssl;

そして、あなたはssl on;行します。

ただし、httpsを提供する場合は、証明書を指定する必要があります。サーバーは、httpリクエストをhttpsリクエストに書き換えるときにhttpsに入ります。

SSLハンドシェイクが何よりも先に行われるため、プロトコルエラーが発生します。そう return 444に到達していません。また、SSLハンドシェイクには、暗号化アルゴリズムに証明書/秘密鍵のペアを提供するために、証明書と秘密鍵が必要です。

3
ikrabbe

returnディレクティブは、書き換えモジュールの一部です。 ドキュメント をチェックすると、リクエストで機能することがわかります。 HTTPSでは、リクエストはハンドシェイクが完了した後にのみ行うことができます。

機能のリクエストがあります: https://trac.nginx.org/nginx/ticket/195 と回避策のソリューションが提供されています。

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