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


28

私は、すべてが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:8443がアクセス可能であり、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 :8443に直接接続したときに得られる正しいアクセス要求です。

"GET / HTTP/1.1" 302

最後に、SSLを使用しない場合でも仮想ホストが完全に正常に機能することにも言及する必要があります。

この作業を行うにはどうすればよいですか?

回答:


34

ついに私はそれを機能させる方法を見つけました。最初にDave Cheneyの提案を試したので、Tomcatの非SSLポートにリダイレクトされるapacheサーバー用の他の証明書をインストールしました(したがって、プロキシは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>

1
ProxyPreserveHost Onそれを避けることは、ほとんど常に間違っていて、役に立たず、ほとんど常に壊れProxyPassReverseます。サイドノートProxyRequests offがデフォルトなので、冗長です。
クバンチク16

代わりに外部IPを使用すると機能しlocalhostません。
チャミンダバンダラ

4

この設定を試してください

<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コネクタの使用を検討する必要があります。


host.domain.orgのアプリケーションが実行されているサーバーで暗号化して証明書を生成します。次に、プロキシサーバーで同じ証明書を再利用する必要がありますか?
ジョックス

2

ただし、同じサーバー上で複数の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

現在、私は実際に負荷分散を使用する必要はありませんが、将来的には役立つかもしれません。洞察力をありがとう。
JMD

1

さて、ここで理解できないのは、同じマシン(http:// localhost:8443 /)にあると思われるApacheからアプリケーションへのSSL接続が必要な理由です。

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

Dave Cheneyが言及したもう1つのことは、ネイティブのTomcatコネクタを使用して、負荷分散やその他の機能を持たせることです。


このようなセットアップを選択する理由は2つあります。最初は、Tomcatサーバーが既にSSLで稼働しているため、Apache VirtualHostを使用するのは簡単だと思いました。2つ目は、アプリケーションのプロバイダー(JIRA)がapache統合のガイドライン(atlassian.com/software/jira/docs/v3.13/apacheintegration.html)を提供し、VirtualHostサポートを追加することで構成に基づいていることです。それが思ったよりも複雑だったと思う、それを動作させることに加えて、私は本当に問題が何であるかを理解したい。
JMD

0

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

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

実際、SSLの使用は私にとって必須です。また、確認のためにSSLを使用せずにプロキシすることもテストしましたが、正常に動作します。SSLサポートが本当の問題です。
JMD

0

まず、localhostからlocalhost:8443へのリクエストを実行できるかどうかを確認し、成功するかどうかを確認します(つまり、GETまたはwget http:// localhost:8443を実行します

havin ga仮想ホストがポート443でリッスンしてから別のsslホストにプロキシする理由がよくわかりません

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


その理由は、同じサーバーにさらにSSLを使用するWebアプリケーションをインストールする必要があり、すべてポート443でリッスンできないためです。したがって、IPベースのVirtualHostsを使用して、各Webアプリケーションが独自のサーバーでホストされているように見せています。次のwgetコマンドをテストし、正常に動作します:wget localhost:8443 --no-check-certificate
JMD

2
注-サーバーに追加のIPアドレスを追加するのは簡単なことです。したがって、ポート443でリッスンする複数のアプリケーションがあります(すべて別々のIPアドレスにあります)。
ブレント

0

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


検証エラーが実際にある場合、解決策は何ですか?
ハビエルメンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.