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を使用しない場合でも仮想ホストは完全に正常に機能することにも触れておきます。
どうすればこれを機能させることができますか?
ついに私はそれを機能させる方法を見つけました。最初に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>
この構成を試してください
<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コネクタの使用を検討する必要があります。
ただし、同じサーバーで複数の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
まあ、私がここで理解していないのは、Apacheから同じマシン上にあるように見えるアプリケーションへのSSL接続が必要な理由です( http:// localhost:8443 / )。
このような設定を行う通常の方法は、Apacheが「顧客」側にSSL暗号化を提供するようにすることです。インターネット、およびアプリケーションへの暗号化されていない接続があります。これにより、アプリケーションの応答をより自由にデバッグできます。
Dave Cheneyが述べたもう1つのことは、負荷分散やその他の機能を実現するためにネイティブのTomcatコネクタを使用することです。
本当にHTTPSサービスにプロキシする必要がありますか? localhostの非SSLサービスにプロキシしたい場合があります。
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
最初に、localhostからlocalhost:8443へのリクエストを実行できるかどうかを確認し、それが成功するかどうかを確認します(IEがGETまたはwget http:// localhost:844 を実行します)。
なぜポート443でリッスンしている仮想ホストを別のsslホストにプロキシするのか、よくわかりません
アプリケーションがネイティブに443を使用できないのはなぜですか?変更できない場合は、iptablesを使用してポートをリダイレクトできます。
SSLエラーログを確認し、CA証明書チェーンを検証できないことに関するエラーがないことを確認してください。