web-dev-qa-db-ja.com

mod-proxyおよびSSLを使用したApache VirtualHost

Apache VirtualHost(同じサーバーで実行されているApache)を介してすべてが提供される複数のWebアプリケーションを備えたサーバーをセットアップしようとしています。私の主な制約は、各WebアプリケーションがSSL暗号化を使用する必要があることです。しばらくグーグルして、stackoverflowに関する他の質問を見た後、VirtualHostの次の構成を書きました。

<VirtualHost 1.2.3.4:443>
    ServerName Host.example.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

https://Host.example.org:844 にはアクセスできますが、 https://Host.example.org にはアクセスできません。これは、仮想ホストの目的に反します。構成。 Firefoxは、サーバーに正常に接続したにもかかわらず、接続が中断されたと不平を言っています。また、Apacheのerror.logに次の警告が表示されます。

proxy: no HTTP 0.9 request (with no Host line) on incoming request and preserve Host set forcing hostname to be Host.example.org for uri 

Webアプリケーション(Tomcatサーバー)では、アクセスログに奇妙なアクセス要求が表示されます。

"?O^A^C / HTTP/1.1" 302

以下は https://Host.example.org:844 に直接接続したときに取得する正しいアクセス要求です。

"GET / HTTP/1.1" 302

最後に、SSLを使用しない場合でも仮想ホストは完全に正常に機能することにも触れておきます。

どうすればこれを機能させることができますか?

28
JMD

ついに私はそれを機能させる方法を見つけました。最初にDave Cheneyの提案を試しました。そのため、Apacheサーバーに他の証明書をインストールして、Tomcatの非SSLポートにリダイレクトしました(そのため、プロキシは http:// localhost:8080 / にリダイレクトされていました)。残念ながら、Webブラウザではhttpsが接続直後にhttpに変換されるため、完全には機能しませんでした。そのため、私は https:// localhost:8443 / を使用するように戻し、SSLProxyEngineを再度追加することで機能しました。

結果のVirtualHost構成は次のとおりです。

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile /etc/Apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/Apache2/ssl/certificate.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>
35
JMD

この構成を試してください

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    SSLEngine On
    # include other ssl options, like cert and key here

    ProxyRequests Off
    ProxyPreserveHost On

    <Location />
        ProxyPass http://localhost:8443/
    </Location>
</VirtualHost>

アプリケーションがプロキシ接続からSSL情報にアクセスする必要がある場合は、mod_proxy_ajpおよびTomcat ajp1.3コネクタの使用を検討する必要があります。

4
Dave Cheney

ただし、同じサーバーで複数のssl対応のWebアプリケーションを実行することが目的の場合。前にApacheを追加しても、上記の構成を使用してそれらのバランスをとるつもりはありません。ロードバランサが必要になるか、次のようなものでApacheのプロキシバランサモジュールを使用できます。

ProxyRequests Off

<Proxy balancer://someapplication>
    BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>


<VirtualHost 1.2.3.4:443>
    SSLEngine on
    SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile //path/to/key.pem
    SSLVerifyClient optional

    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

<Location />
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
</Location>

ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on
2
Brendan

まあ、私がここで理解していないのは、Apacheから同じマシン上にあるように見えるアプリケーションへのSSL接続が必要な理由です( http:// localhost:8443 / )。

このような設定を行う通常の方法は、Apacheが「顧客」側にSSL暗号化を提供するようにすることです。インターネット、およびアプリケーションへの暗号化されていない接続があります。これにより、アプリケーションの応答をより自由にデバッグできます。

Dave Cheneyが述べたもう1つのことは、負荷分散やその他の機能を実現するためにネイティブのTomcatコネクタを使用することです。

1
zero_r

本当にHTTPSサービスにプロキシする必要がありますか? localhostの非SSLサービスにプロキシしたい場合があります。

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
0
codehead

最初に、localhostからlocalhost:8443へのリクエストを実行できるかどうかを確認し、それが成功するかどうかを確認します(IEがGETまたはwget http:// localhost:844 を実行します)。

なぜポート443でリッスンしている仮想ホストを別のsslホストにプロキシするのか、よくわかりません

アプリケーションがネイティブに443を使用できないのはなぜですか?変更できない場合は、iptablesを使用してポートをリダイレクトできます。

0
Brendan

SSLエラーログを確認し、CA証明書チェーンを検証できないことに関するエラーがないことを確認してください。

0
Neobyte