Я следовал этому руководству: 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>
И когда я пытаюсь подключиться к серверу через веб-браузер, я получаю такую ошибку:
[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 на другой хост.
Поскольку я был ленив и хосты находятся в моей изолированной сети, эти директивы решили проблему:
SSLProxyVerify нет
SSLProxyCheckPeerCN выключен
Не беспокойтесь о HTTPS между внешним и внутренним сервером, нет смысла включать SSL для localhost
подключение.
Чтобы уточнить, используйте ProxyPass / http://localhost:3002/
вместо того ProxyPass / https://localhost:3002/
В качестве альтернативы, если вы действительно хотите подключить обратный прокси-сервер к внутреннему серверу с помощью SSL (в основном полезно, когда этот сервер не там, где находится обратный прокси-сервер Apache Httpd), в дополнение к https://backend-server-address
, использовать SSLProxy*
директивы для настройки сертификатов CA, как описано в введение в mod_proxy
документация. В частности, вам нужно будет настроить SSLProxyCACertificateFile
и убедитесь, что сертификат внутреннего сервера выдан на правильное имя хоста как видно из Apache Httpd (т.е. localhost
в твоем случае).
Если вы не подключаетесь к своему внутреннему серверу с помощью SSL, он может не определить, что вы действительно используете SSL, и настроить его так, чтобы заставить вас перейти на SSL (отсюда и бесконечные перенаправления). Вы можете посмотреть на аналогичные механизмы, как Джетти делает со своими forwarded
вариант (чтобы иметь возможность сообщить серверу, что он находится за прокси). Rails может интерпретировать X-Forwarded-Proto
по умолчанию. В этом случае добавьте это в свою конфигурацию Apache (на виртуальном хосте SSL):
RequestHeader set X-Forwarded-Proto 'https'
Кажется, обсуждается похожий вопрос Вот, например.
Если внутренний сервер использует устаревший самоподписанный сертификат, потребуется еще один вариант (если нет доступа к внутреннему серверу):
SSLProxyCheckPeerExpire выключен