web-dev-qa-db-ja.com

mod_vhost_aliasを使用してApache2 / httpdマス仮想ホスティングでSSLを構成する方法

私は今かなり検索していますが、答えが見つかりませんでした。

Httpd2.2.15とCentos6.2を使用しています。

大規模仮想ホスティング用にApacheを構成しました。つまり:

UseCanonicalName off
VirtualDocumentRoot /var/www/html/%0

同じ「メイン」ドメインがあり、異なるサブドメインが仮想ホストを指しています。テスト用に、共通名* .mydomain.comで自己署名証明書を作成しました。サーバー全体に1つのIPがあります。

Vhostにsslを使用するようにApacheを構成するにはどうすればよいですか?

そして、可能であれば、上記に加えて、これも達成したいと思います。

  1. SSLから除外する必要のあるディレクトリ、またはできればいくつかのファイル(ログインページなど)を定義できますか?すべてのvhostは、基本的に同じアプリケーションの異なるインスタンスです(以下の2で説明するものを除く)。

  2. Sslを使用してはならないいくつかのvhostを定義できますか(それらのサブドメイン名を完全に制御できます)。これは、私のホームページ(www)といくつかの管理アプリケーションの2つのアプリケーションになります。例外を作ることができない場合は、別のサーバーに置くだけだと思います。

上記の2で述べたものを除いて、すべての仮想ホストはユーザーの要求に基づいて自動的に作成されます。

@Shanesのコメントに基づいて、私はpdate:ユーザーがhttps://を使用すべきでないときに使用する場合は、http://にリダイレクトされるとよいでしょう。それが不可能な場合は、エラーメッセージが表示されても問題ないと思います。もちろん、httpが保護されていないファイルに対して機能する限り、httpとhttpsの両方が機能する場合は問題ありません(これは実際には推奨される選択かもしれません)。

マスドメイン用ではなかった(つまり、<VirtualHost>が使用された)ことを除いて、mod-rewriteを使用してこれを行う方法の例を見つけることができました。

これを達成するための秘訣は何ですか?

不可能な場合は、これを行う方法についていくつかのヒントを得ることができれば幸いです。

3
Nicsoft

まず、SSLリスナーを追加するために現在の構成が準備されていることを確認する必要があります。メインサーバーを使用しているか、<VirtualHost>を使用しているかは指定していませんが、メインサーバーの場合は、<VirtualHost>に切り替える必要があります。

<VirtualHost *:80>
    ServerName everything.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/html/%0
    # insert logging config, anything else you need..
    <Directory /var/www/html/>
        Order Allow,Deny
        Allow from all
        # Get rid of this if you need to allow htaccess files:
        AllowOverride None
    </Directory>
    RewriteEngine On
    # We're going to insert some Rewrite configuration here in a minute.
</VirtualHost>

次に、SSLを実行する新しいVirtualHostを追加します。

# Add this if you don't already have it:
Listen 443

<VirtualHost *:443>
    ServerName everything.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/html/%0

    SSLEngine On
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/private.key

    # insert logging config, anything else you need..
    <Directory /var/www/html/>
        Order Allow,Deny
        Allow from all
        # Get rid of this if you need to allow htaccess files:
        AllowOverride None
    </Directory>
    # if you want to kick someone back to HTTP if they're using HTTPS,
    # do that with Rewrite configuration here.  For example:
    #RewriteRule ^/(non/sensitive/content.*\.html)$ http://%{HTTP_Host}/$1 [R=301,L]
</VirtualHost>

つまり、コンテンツがすべてHTTPとHTTPSの両方を介して提供されるようになります。これで、特定のドメインにHTTPSを強制するために、mod_rewriteを使用できます。

重要なセキュリティ情報!ここではセキュリティの観点から非常に注意する必要があります。 HTTP上のすべてを同等のHTTPSにリダイレクトするだけの場合は、リソースの場所がハードコードされているために、リクエストがHTTPSではなくHTTP経由で送信されるケースを「非表示」にすることができます。そのリクエストに機密データが含まれている場合は、暗号化されずにインターネット経由で送信されます。このリスクを、この種の問題を見つけて修正する能力、何かが台無しになった場合のエラーページの使いやすさ、およびデータの機密性と比較検討する必要があります。

特定の場所にSSLを強制するには、mod_rewrite構成をポート80の仮想ホストに挿入する必要があります(上記の構成でコメントしました)。ディレクトリまたはドメインを除外する限り、必要なほとんどすべての種類の動作を構築できます。いくつか例を示します。

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_Host} !^static\.example\.com$
# Exclude the directory /images
RewriteCond %{REQUEST_URI} !^/images/
# Exclude requests to .css files
RewriteCond %{REQUEST_URI} !\.css$
# This is the more secure but less user friendly version - block requests to the non-secured port.
RewriteRule ^ - [F,L]
# This is the user friendly version, where you need to be especially careful that
# your site never sends sensitive data to http accidentally:
#RewriteRule ^/(.*)$ https://%{HTTP_Host}/$1 [R=301,L]

または、ベースディレクトリへのリクエストに対してのみフレンドリリダイレクトを実行し、他のユーザーに対してはエラー動作を実行する場合:

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_Host} !^static\.example\.com$
# ..insert other exclusion conditions here..
RewriteRule ^/$ https://%{HTTP_Host}/ [R=301,L]

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_Host} !^static\.example\.com$
# ..insert other exclusion conditions here..
RewriteRule ^ - [F,L]

これらの例があなたのニーズに合わない場合は、私に知らせてください。

4
Shane Madden