web-dev-qa-db-ja.com

nginx HTTPS WWWリダイレクトが非WWWに

私のSSL証明書はmydomain.comのためのものなので、wwwなしですべてのwww.mydomain.comをリダイレクトしようとしています。今、これらすべての作業:

http://www.mydomain.com
http://mydomain.com
https://mydomain.com

しかし https://www.mydomain.com はブラウザに「サイトが安全ではありません」という警告を表示しています...以下のようなリダイレクトを設定しようとしましたが、スクリプトのどこにバグがあるか教えてください...

     server {
        listen      80;
        server_name www.mydomain.com mydomain.com;
        rewrite     ^(.*)   https://mydomain.com$1 permanent;
        client_max_body_size 100M;
            location / {
                   index    index.htm index.html index.php;
            }

            location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
            }


    }



    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;


        server_name www.mydomain.com;
        rewrite ^(.*) https://mydomain.com$1 permanent;

    }





    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;
        client_max_body_size 100M;
        server_name mydomain.com;
        root /var/www/mysite;
        index index.php;

        location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
        }


    }
8
James Gu

設定スクリプトにバグはありません。

現在の構成では(標準の単一サブジェクトSSL証明書がインストールされていると仮定して)、これはオプションではありません

この理由は、https接続のしくみです。

クライアント(ブラウザ)がサーバー(nginx)にhttpsリクエストを発行すると、SSLハンドシェイクを介してSSLセッションを開始します。ハンドシェイクが成功してセッションが確立された場合にのみ、ブラウザはホスト名を含む実際のHTTPリクエストを送信します。 SSL/TLSはデータ接続に暗号化を提供する方法であるだけでなく、サーバーがクライアントに対して自身を認証する方法でもあるためです。認証プロセスの一環として、ブラウザーはサーバーのIDを検証します。検証チェックの1つは、証明書のサブジェクト名を、ブラウザーがコンテンツを要求しようとしているホスト名と照合することです。この検証が失敗した場合、ブラウザはユーザーに警告を発行します。

検証プロセスが失敗するため、サーバーはポート443リスナーでwww.mydomain.comのHTTPリクエストを受信しないため、リダイレクト応答をクライアント/ブラウザーに送信できません。

https://www.mydomain.com/ から https://mydomain.com へのリダイレクトを有効にするには、いくつかのオプションがありますが、すべてこのようになります:ホスト名ごとにサブジェクトを含む証明書が必要です。

  1. SAN証明書

    • UC/SAN証明書を取得し、www.mydomain.comをSAN(Subject Alternate Name)として追加します。
    • 件名がmydomain.comwww.mydomain.com の両方の要求に一致するようになりました。
  2. 複数のIPアドレス

    • サーバーの別のIPアドレスを取得します。
    • サブジェクト名www.mydomain.comのSSL証明書を取得します
    • 新しいIPアドレスをリッスンするようにwww.mydomain.com https serverを構成します(まだポート443)
    • 新しい証明書を使用するようにwww.mydomain.com https serverを構成します
    • パブリックDNSゾーンの新しいIPアドレスを指すようにwww.mydomain.comのAレコードを更新します
  3. TLS SNI

    • 上記の例のように、サブジェクト名www.mydomain.comのSSL証明書を取得します
    • 別のIPアドレスを使用する代わりに、サーバー名表示TLS拡張を利用します。

SNIはブラウザのサポートに制限があるため、提案3は避けます。 SNIのnginxドキュメント を確認してください(ページの下部)。

[〜#〜] update [〜#〜]:一部の認証局は、追加の無料の単一サブジェクト証明書を提供しますSAN = www.接頭辞。

14

ドメインが一致しない場合、「site-not-safe」警告を回避することはできません。証明書は、リダイレクト専用ドメインを含め、HTTPS経由で提供するすべての単一ドメインで有効である必要があります。

証明書が「www.example.com」に対して有効でなく、「example.com」に対してのみ有効である場合、 https://www.example.com/ から-にリダイレクトできません https://example.com/ セキュリティ警告なし。

6
cnst

あなたはこれを試すことができます:

server {    
        listen 443;
        server_name  www.domain.com;
        return 301 https://domain.com$request_uri;
}

それ以外の場合は、ワイルドカード証明書を取得できます。これにより、すべての第3レベルドメインがカバーされます。

3
tacotuesday