これは私が最終的に全力を尽くそうとしていることです:SNIを持つ単一の証明書を使用して複数の仮想ホストにTLSを設定しようとしています。つまり、同じ証明書を使用してhttps://example.com
とhttps://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.com
はhttps://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_certificate
とssl_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;
}
と、デフォルトのサーバブロックで構成された証明書を使用しています。どうして?
今日の設定ファイル全体を投稿できますか? –
複数の返信をおかけして申し訳ありません。私は自分の投稿の下にnginx.confの内容を追加しました。 Debianによってインストールされたデフォルトのconfとほとんど変わりません。 – momotaro