私はこのガイドに従いました: http://hints.macworld.com/article.php?story=20041129143420344
これが私の仮想ホスト定義です
<VirtualHost *:443>
SSLEngine on
SSLProxyEngine On
RequestHeader set Front-End-Https "On"
CacheDisable *
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
DocumentRoot "/Users/me/projects/myproject/public"
ServerName ssl.mydomain.com
ServerAlias *.ssl.mydomain.com
SSLCertificateKeyFile "/private/etc/Apache2/certs/webserver.nopass.key"
SSLCertificateFile "/private/etc/Apache2/certs/newcert.pem"
SSLCACertificateFile "/private/etc/Apache2/certs/demoCA/cacert.pem"
SSLCARevocationPath "/private/etc/Apache2/certs/demoCA/crl"
ErrorLog "/Users/me/Desktop/ssl.log"
ProxyPass / https://localhost:3002/
ProxyPassReverse / https://localhost:3002
ProxyPreserveHost on
</VirtualHost>
そして、sevre viov Webブラウザーに接続しようとすると、次のエラーが発生します。
[Thu Feb 02 16:50:40 2012] [error] (502)Unknown error: 502: proxy: pass request body failed to 127.0.0.1:3002 (localhost)
[Thu Feb 02 16:50:40 2012] [error] [client 96.11.81.39] proxy: Error during SSL Handshake with remote server returned by /session/new
[Thu Feb 02 16:50:40 2012] [error] proxy: pass request body failed to 127.0.0.1:3002 (localhost) from 96.11.81.39 ()
これをデバッグ/修正するにはどうすればよいですか?
Vbartoniの答えに追加すると、Apache 2.4以降では、異なるデフォルトと新しいディレクティブがあるようです。
私はApache 2.4.6を実行していますが、それを機能させるために次のディレクティブを追加する必要がありました。
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
フロントエンドサーバーとバックエンドサーバーの間でHTTPSを気にしないでください。localhost
接続に対してSSLを有効にしても意味がありません。
明確にするには、ProxyPass / http://localhost:3002/
の代わりにProxyPass / https://localhost:3002/
を使用します
または、SSLを使用してリバースプロキシをバックエンドサーバーに接続したい場合(そのサーバーがApache Httpdリバースプロキシがない場合に最も役立ちます)、https://backend-server-address
に加えて、 SSLProxy*
ディレクティブは、 _mod_proxy
documentation の概要に記載されているように、CA証明書を設定します。特に、SSLProxyCACertificateFile
を構成し、バックエンドサーバーの証明書が正しいホスト名に対して発行されていることを確認する必要がありますApache Httpdで確認(つまり、localhost
あなたの場合)。
SSLを使用してバックエンドサーバーに接続していない場合、実際にSSLを使用していることを検出できず、SSLに強制的に移動するように構成されている可能性があります(そのため、無限リダイレクト)。 Jettyがforwarded
オプション を使って行うことと同様のメカニズムを確認することをお勧めします(バックエンドがプロキシの背後にあることを認識できるようにするため)。 RailsはデフォルトでX-Forwarded-Proto
を解釈できる可能性があります。この場合、これを(SSL仮想ホストの)Apache構成に追加します:
RequestHeader set X-Forwarded-Proto 'https'
たとえば、 こちら で説明されている同様の問題があるようです。
プロキシが別のホストにhttpsトラフィックを転送していたことを除いて、同様の問題(同じエラーログ)がありました。
私は怠惰で、ホストが自分の隔離されたネットワークにあるので、これらのディレクティブは問題を解決しました:
SSLProxyVerifyなし
SSLProxyCheckPeerCNオフ
バックエンドサーバーが古い自己署名証明書を使用している場合、もう1つのオプションが必要です(バックエンドサーバーにアクセスできない場合)。
SSLProxyCheckPeerExpireオフ