У меня есть приложение Java, которое должно общаться с другим веб-сайтом интрасети, используя HTTPS в обоих направлениях. Некоторое время после борьбы с реализациями SSL в Java я отказался от этого и теперь настроил Apache, который должен действовать как двунаправленный обратный прокси-сервер:
external app ---(HTTPS request)---> Apache ---(local HTTP request)---> Java app
Это направление работает просто отлично, а другое - нет:
Java app ---(local HTTP request)---> Apache ---(HTTPS request)---> external app
Это конфигурация для vhost, реализующего второй прокси:
Listen 127.0.0.1:8081
<VirtualHost appgateway:8081>
ServerName appgateway.local
SSLProxyEngine on
ProxyPass / https://externalapp.corp:443/
ProxyPassReverse / https://externalapp.corp:443/
ProxyRequests Off
AllowEncodedSlashes On
# we do not need to apply any more restrictions here, because we listened on
# local connections only in the first place (see the Listen directive above)
<Proxy https://externalapp.corp:443/*>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
curl http://127.0.0.1:8081/
должен служить эквивалентом https://externalapp.corp
, но вместо этого выдается 403 Forbidden
со следующим сообщением в журнале ошибок Apache:
[Wed Jun 04 08:57:19 2014] [error] [client 127.0.0.1] Directory index forbidden by Options directive: /srv/www/htdocs/
Это сообщение совершенно озадачивает: да, я не настроил никаких разрешений для DocumentRoot этого vhost, но все отлично работает для другого направления прокси, где у меня нет. Для справки, вот другой vhost:
Listen this_vm_hostname:443
<VirtualHost javaapp:443>
ServerName javaapp.corp
SSLEngine on
SSLProxyEngine on
# not shown: SSLCipherSuite, SSLCertificateFile, SSLCertificateKeyFile
SSLOptions +StdEnvVars
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ProxyRequests Off
AllowEncodedSlashes On
# Local reverse proxy authorization override
<Proxy http://localhost:8080/*>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>