web-dev-qa-db-ja.com

ワイルドカード証明書(nginx)を使用せずに、HTTPSを使用してすべてのサブドメインをメインドメインにリダイレクトします

私はメインサイトといくつかのvhostsを持つドメイン名を持っています。すべてのサイト(メインサイトとvhosts)にHTTPS経由でのみアクセスできるようにし(HSTSを使用)、存在しないサブドメインをメインサイトにリダイレクトしたい。

私が欲しいものを要約すると:

  • https:/example.com:リダイレクトなし(メインサイト)
  • http:/example.com:https:/example.comにリダイレクトされます
  • https:/vhost.example.com:リダイレクトなし(仮想ホスト)
  • http:/vhost.example.com:https:/vhost.example.comにリダイレクトされます
  • https:/doesntexist.example.com:https:/example.comにリダイレクトされます
  • http:/doesntexist.example.com:https:/example.comにリダイレクトされます

私はこれに非常に近いですが、最後から2番目のリダイレクトは機能しません。 Let's Encrypt の証明書を使用していますが、現時点ではワイルドカード証明書を提供していないため、証明書はメインドメインとvhost(私が明示的にリストしたもの)に対してのみ有効です。証明書を作成しました)。証明書が無効であるため、ブラウザは接続をブロックします。

この問題を回避するための最良の方法(もしあれば)は何でしょうか?

それが役立つ場合は、これが私の(簡略化された)nginx構成です:

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

server {
    listen 443 spdy;
    server_name _;
    # SSL settings snipped for brevity. SPDY and HSTS are enabled.
    return 301 https://example.com$request_uri;
}

server {
    listen 443 spdy;
    server_name example.com;
    root /var/www/example.com;
    index index.html index.htm;
}

server {
    listen 443 spdy;
    server_name vhost.example.com;
    root /var/www/vhost.example.com;
    index index.html index.htm;
}
4
Joe La Frite

実際には、ワイルドカード証明書がないと問題を回避できません。要求されている名前と一致する証明書を提示できない場合は、接続エラーが発生します。これはプロトコルの基本的な部分です。

理論的には、証明書にない名前のSNIヘッダーを受信したときに、Let's Encryptから証明書をすばやく発行し、その新しく作成された証明書をTLSハンドシェイクで返送するようなものを作成できると思いますが。 ..まあ、それは正確には実用的ソリューションではありませんか?

3
womble