2016-10-31 1 views
1

これは私が最終的に全力を尽くそうとしていることです:SNIを持つ単一の証明書を使用して複数の仮想ホストにTLSを設定しようとしています。つまり、同じ証明書を使用してhttps://example.comhttps://host.example.comを提供したいと思います。どちらのホストも同じIPv4アドレスに解決されます。Nginx vhostはssl_certificate *ディレクティブをデフォルトブロックから継承していますか?

ssl_certificate*ディレクティブでNginxが何をしているのか理解できません。これらのディレクティブは、デフォルトのサーバーブロックでのみ定義されますが、別のブロックでは "ピックアップ"されています。

予想したように、私は404

server { 
    return 404; 
} 

にデフォルトのサーバーのブロックを始め、

$ curl --head http://example.com 
HTTP/1.1 404 Not Found 
[...] 

は、その後、私は頂点にhttpをhttpsにリダイレクトするために最初example.comブロックを作成しました:

これも機能します。

$ curl --head http://example.com 
HTTP/1.1 301 Moved Permanently 
[...] 
Location: https://example.com 

$ curl --head http://host.example.com 
HTTP/1.1 404 Not Found 
[...] 

は、その後、私は頂点にTLSを設定した:

server { 
    listen 443 ssl; 
    ssl_certificate [...]; 
    ssl_certificate_key [...]; 
    server_name example.com; 
} 

これまでのところ、とても良い:のhttpがhttpsにリダイレクト、およびhttps作品。

$ curl --head http://example.com 
HTTP/1.1 301 Moved Permanently 
[...] 
Location: https://example.com 

$ openssl s_client -connect example.com:443 
CONNECTED(00000003) 
[...] 
--- 
GET/HTTP/1.1 
Host: example.com 

HTTP/1.1 200 OK 

次に、私は簡単な説明をしました。私は、TLS経由で接続しようとしたとき、私はまだ、まだhost.example.comについての単語を言った、としていなかった。それが必要として

$ curl --head http://host.example.com 
HTP/1.1 404 Not Found 
[...] 

$ openssl s_client -connect host.example.com:443 
CONNECTED(00000003) 
[...] 
--- 
GET/HTTP/1.1 
Host: host.example.com 

HTTP/1.1 200 OK 
[... content from example.com...] 

デフォルトのブロックは、http://host.example.comに応答しています。しかしhttps://host.example.comhttps://example.comのサーバーブロックと一致しています。

ヘッドスクラッチのビットの後、私は2つのデフォルトブロックが必要であることを認識しました。各ブロックに1つ。

$ openssl s_client -connect host.example.com:443 
CONNECTED(00000003) 
[...] 
--- 
GET/HTTP/1.1 
Host: host.example.com 

HTTP/1.1 404 Not Found 
[...] 

しかし、私は何かを実現:これを確認

server { 
    listen 443 ssl; 
    ssl_certificate [...]; 
    ssl_certificate_key [...]; 
    return 404; 
} 

は私が必要なものです。そして、ここで私の混乱が始まります。 TLS経由でexample.com:443(またはhost.example.com:443)に接続することはできません。理由はわかりません。はすべてです。私はポート443のための第二のデフォルトサーバーを作成したとき

、私https://example.com用サーバブロックからssl_certificatessl_certificate_keyディレクティブを削除しました。これらはデフォルトのサーバーブロックでのみ定義されています。

server { 
    listen 443 ssl; 
    ssl_certificate [...]; 
    ssl_certificate_key [...]; 
    return 404; 
} 

server { 
    listen 443 ssl; 
    server_name example.com; 
    # No ssl_certificate* directives! 
} 

そして、私はhttps://example.comに接続しようとすると、まだ、どういうわけか、私はデフォルトサーバブロックで定義された証明書が使用されてしまう:

$ openssl s_client -connect example.com:443 
CONNECTED(00000003) 
[...] 
--- 
GET/HTTP/1.1 
Host: example.com 

HTTP/1.1 200 OK 
[...] 

をそして私はまた、URLを訪問していることが確認さブラウザのhttps://example.comが実際のページを表示します。

ので、https://example.comのための構成がは、デフォルトのブロックからTLSの設定を継承したが、その後一致するサーバブロックから残りの設定を適用するように思われます。それは何が起こっているのですか?私は、 "nginx"、 "tls"、 "ssl"、 "vhost"、 "default server block"、 "inherits"、 "inheritance"のようなキーワードのほとんどを検索しようとしました。しかし私は何も見つけることができません、そして、ドキュメントは静かであるようです。おそらくどこかに書かれていますが、私は正しい場所を探していません。

を追加しました:基本的なDebianのパッケージデフォルトからほとんど変わらず、インストールされ

完全なコンフィギュレーション、。

user www-data; 
worker_processes auto; 
pid /run/nginx.pid; 
include /etc/nginx/modules-enabled/*.conf; 
# above line loads: 
# ngx_http_auth_pam_module, ngx_http_geoip_module, ngx_http_image_filter_module, ngx_http_xslt_filter_module, ngx_mail_module, ngx_stream_module 

events { 
    worker_connections 768; 
} 

http { 
    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on; 
    keepalive_timeout 65; 
    server_tokens off; 
    include /etc/nginx/mime.types; # nothing unusual in here 
    default_type application/octet-stream; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # drop SSLv3 
    ssl_prefer_server_ciphers on; 
    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log 
    gzip on; 
    gzip_disable "msie6"; 
    include /etc/nginx/conf.d/*.conf; # empty directory, includes nothing 
    include /etc/nginx/sites-enabled/*; # includes single file which defines server blocks as above 
} 

これは基本的にそれです。

AGAIN編集:ここでは

はすべて一箇所に、完全なサーバーの設定ファイルです。

https://example.com作品を訪問し、このような構成により
server { 
    listen 80; 
    return 404; 
} 

server { 
    listen 443 ssl; 
    ssl_certificate [...]; 
    ssl_certificate_key [...]; 
    return 404; 
} 

server { 
    listen 80; 
    server_name example.com; 
    return 301 https://example.com; 
} 

server { 
    listen 443 ssl; 
    server_name example.com; 
    root /srv/www/example.com; 
    index index.html; 
} 

と、デフォルトのサーバブロックで構成された証明書を使用しています。どうして?

+0

今日の設定ファイル全体を投稿できますか? –

+0

複数の返信をおかけして申し訳ありません。私は自分の投稿の下にnginx.confの内容を追加しました。 Debianによってインストールされたデフォルトのconfとほとんど変わりません。 – momotaro

答えて

1

これはdocumentationによると、実際に予想される動作です:

ブラウザがHTTPリクエスト とnginxのは、要求されたサーバの名前を知らない送信する前に、SSL接続が確立されます。 したがって、デフォルトサーバーの証明書のみを提供することができます。

ソリューションは、different IPsを使用することです:

そう 最初のサーバーの証明書がされるため、HTTPSプロトコルの制限に 仮想サーバが異なるIPアドレスをリッスンする必要があることを念頭に置くべきです2番目のサイトで発行されました。

関連する問題