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


9

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バージョンと同じ動作を得るには、httpsルールを適切に構成する方法を教えてください。

更新:

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

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

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


2
できません。SSLは、Webサーバーが必要なドメインを認識する前に証明書を必要とします。送信する証明書が必要です。または、クライアントと通信するための接続を確立できません。
ダースAndroid

2
@DarthAndroid:魔法がSNIと呼ばれている- en.wikipedia.org/wiki/Server_Name_Indication
Shi

@Shi SNIを知っています-これにより、Webサーバーは送信する証明書を選択できますが、証明書を選択する必要があります。nginxユーザーがやりたいことのための証明書が必要ないことを理解するのに十分スマートではありません。
ダースAndroid

回答:


3

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

listen 1234 ssl;

その場合、ssl on;ラインは必要ありません。

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

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


3

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

(nginxの自身のように、これは非SNI対応のHTTPSクライアントを中断します注意してくださいproxy_pass、あなたが設定されていない限り、proxy_ssl_server_name on;)に達するから、他のserver_names(そう、本質的に正当破るserver_nameあなたはというのを通すたい)。詳細については、trac.nginx.org / nginx / ticket / 195#comment:11を参照してください。
nh2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.